SlideShare a Scribd company logo
1 of 16
Download to read offline
Boost.勉強会 #7 東京 ( 2011-12-03 )

C++ TIPS 2 インクリメント編
概要
 主に cppll ML でご紹介してきた tips をC++
 の仕様をより掘り下げた形でまとめ直し
 てみました。
 今回はインクリメントにフォーカスした
 内容です。


               C++ Tips Boost.勉強会 #7 東京   2
C++ Tips

インクリメント
インクリメントとは?
 プログラミング用語としてのインクリメント
  は値を+1したりあるいはイテレータなどを
  一つ進めることを意味し、デクリメントは逆
  に-1したり一つ戻したりすることを意味し
  ます。
 C言語およびC言語を文法のベースにしている
  多くの言語では ++ がインクリメント演算子
  として、 -- がデクリメント演算子と使えます。
           C++ Tips Boost.勉強会 #7 東京   4
インクリメントとは?
 インクリメント演算子もデクリメント演
  算子もひとつの値を対象とする単項演算
  子です。
 ++i のようにインクリメント演算子を演算
  対象の値の前に置くと前置インクリメン
  トと呼ばれi++のように値の前に置くと後
  置インクリメント呼ばれます。
          C++ Tips Boost.勉強会 #7 東京   5
インクリメントとは?
 ++i であっても i++ であっても i はインクリ
 メントされます。
 前置と後置の違いは式の評価値が、前置
 の場合はインクリメント後の値となり、
 後置の場合はインクリメント前の値とな
 ることです。

             C++ Tips Boost.勉強会 #7 東京   6
未定義動作
 関数引数内で同じ変数に大してインクリ
メントやデクリメントをやっちゃうと未
定義動作になってしまうので気をつけま
しょう。 int a = 0;
        ++a; // OK
        ++a; // OK
        f(++a, ++a); // NG
             C++ Tips Boost.勉強会 #7 東京   7
未定義動作
 ポインタや参照を使うと分かり難い形で
この未定義動作になってしまうことがあ
るので要注意です。

void f(int &a, int &b) { h(++a, ++b); }
void g(int &c) { f(c,c); } // NG


                 C++ Tips Boost.勉強会 #7 東京   8
インクリメントの定義
 C++ではユーザー定義のクラスであってもイ
  ンクリメント/デクリメントを定義できます。
 言語使用上はその中身は別にインクリメント
 /デクリメントに類する処理である必要はあ
 りません。
  ただ、混乱の元になるだけなのでインクリメント/
  デクリメントおよびそれに類する処理以外に使う
  のはやめておきましょう。

            C++ Tips Boost.勉強会 #7 東京   9
インクリメントの定義
class hoge {
  public:
    typedef hoge this_type;
    int value;
    this_type & operator ++ () { // 前置インクリメント
        ++value;
        return *this;
    }
    this_type operator ++ (int) { // 後置インクリメント
        this_type temp(*this);
        ++value;
        return temp;
    }
};                           C++ Tips Boost.勉強会 #7 東京   10
メンバー関数呼び出し風の使用
 通常のメンバー関数と同じ形式での呼び
出しも可能です。
 hoge hige;
 hige.operator++(); // 前置インクリメント
 hige.operator++(0); // 後置インクリメント



                C++ Tips Boost.勉強会 #7 東京   11
メンバー関数呼び出し風の使用
 後置インクリメントの引数は通常のメン
バー関数と同様に使おうと思えば普通に
使えます。
  通常のメンバー関数と同じ形式で呼び出す場
 合に限る話であり、i++ のような形式では呼び
 出し側から任意の値を渡すことはできません。


          C++ Tips Boost.勉強会 #7 東京   12
後置で複製を作らないには?
 デストラクタでインクリメントを行う一時オブ
 ジェクトを作ることで、後置インクリメントの
 実装で自身の複製を作らないようにすることも
 可能です。
  どのみち、なんらかの一時オブジェクトが必要である
   ことには変わりが無い。
  型が変わってしまうという副作用がある為、あまり推
   奨できません。
  複製のコストが高いクラスやストリームのイテレータ
   などで有効な手段となります。

            C++ Tips Boost.勉強会 #7 東京   13
どちらでもよい場合は前置
 通常、組み込み型以外の後置インクリメントではイン
  クリメント前のコピーである一時オブジェクトを返す
  ことになり、前置インクリメントでも構わない場合に
  後置インクリメントを使うことは無駄なコストを支払
  うことになるのでどちらでもよい場合は前置インクリ
  メントを使いましょう。
 組み込み型の場合はどちらでも気にする必要はありま
  せんが、統一性の観点やコード修正により変数の型が
  組み込み型でなくなった場合に備えて、組み込み型で
  も前置インクリメントを使いましょう。

            C++ Tips Boost.勉強会 #7 東京   14
C++ Tips

質疑応答
C++ Tips

ご清聴ありがとうございました。

More Related Content

What's hot

君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
 
Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
digitalghost
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
Shota Baba
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
Kota Mizushima
 

What's hot (20)

C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
 
Emcpp0506
Emcpp0506Emcpp0506
Emcpp0506
 
Better C#の脱却を目指して
Better C#の脱却を目指してBetter C#の脱却を目指して
Better C#の脱却を目指して
 
C++11
C++11C++11
C++11
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
 

Viewers also liked

猫にはわからないGit講座
猫にはわからないGit講座猫にはわからないGit講座
猫にはわからないGit講座
Yusei Yamanaka
 
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
CROOZ, inc.
 
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
Takashi Uemura
 
セキュリティ業務の内製とチームメンバー育成
セキュリティ業務の内製とチームメンバー育成セキュリティ業務の内製とチームメンバー育成
セキュリティ業務の内製とチームメンバー育成
Toshiharu Sugiyama
 

Viewers also liked (19)

わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
Visual C++ 2015の紹介(C++11/14的に)
Visual C++ 2015の紹介(C++11/14的に)Visual C++ 2015の紹介(C++11/14的に)
Visual C++ 2015の紹介(C++11/14的に)
 
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
 
猫にはわからないGit講座
猫にはわからないGit講座猫にはわからないGit講座
猫にはわからないGit講座
 
Github勉強会
Github勉強会Github勉強会
Github勉強会
 
Gitの使い方あれこれ
Gitの使い方あれこれGitの使い方あれこれ
Gitの使い方あれこれ
 
C++11やemscriptenと付き合って1年間の振り返り
C++11やemscriptenと付き合って1年間の振り返りC++11やemscriptenと付き合って1年間の振り返り
C++11やemscriptenと付き合って1年間の振り返り
 
ノンプログラマでも今日から使える「Git」でバージョン管理
ノンプログラマでも今日から使える「Git」でバージョン管理ノンプログラマでも今日から使える「Git」でバージョン管理
ノンプログラマでも今日から使える「Git」でバージョン管理
 
コンセプトから理解するGitコマンド
コンセプトから理解するGitコマンドコンセプトから理解するGitコマンド
コンセプトから理解するGitコマンド
 
Git flowの活用事例
Git flowの活用事例Git flowの活用事例
Git flowの活用事例
 
はじめようGit
はじめようGitはじめようGit
はじめようGit
 
15分でわかるGit入門
15分でわかるGit入門15分でわかるGit入門
15分でわかるGit入門
 
やりなおせる Git 入門
やりなおせる Git 入門やりなおせる Git 入門
やりなおせる Git 入門
 
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
 
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
 
デザイナのためのGit入門
デザイナのためのGit入門デザイナのためのGit入門
デザイナのためのGit入門
 
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
 
セキュリティ業務の内製とチームメンバー育成
セキュリティ業務の内製とチームメンバー育成セキュリティ業務の内製とチームメンバー育成
セキュリティ業務の内製とチームメンバー育成
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 

Similar to C++ tips2 インクリメント編

Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
fuzzysphere
 
Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成について
Tatsuhiko Yamamura
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
sunaemon
 

Similar to C++ tips2 インクリメント編 (20)

C#勉強会
C#勉強会C#勉強会
C#勉強会
 
Boost17 cpplinq
Boost17 cpplinqBoost17 cpplinq
Boost17 cpplinq
 
boost - std - C#
boost - std - C#boost - std - C#
boost - std - C#
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成について
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
 
C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)
 
Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門Swiftによる関数型プログラミング超入門
Swiftによる関数型プログラミング超入門
 
F#のinlineと型推論(狩)
F#のinlineと型推論(狩)F#のinlineと型推論(狩)
F#のinlineと型推論(狩)
 
C++の復習
C++の復習C++の復習
C++の復習
 
[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス
[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス
[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス
 
.NETの自作ツール公開手段
.NETの自作ツール公開手段.NETの自作ツール公開手段
.NETの自作ツール公開手段
 
More C++11
More C++11More C++11
More C++11
 
What is template
What is templateWhat is template
What is template
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
Database, Polymorphism and Modern C++
Database, Polymorphism and Modern C++Database, Polymorphism and Modern C++
Database, Polymorphism and Modern C++
 
The evolution of c#
The evolution of c#The evolution of c#
The evolution of c#
 

More from 道化師 堂華

More from 道化師 堂華 (8)

Reflection with xamarin.forms
Reflection with xamarin.formsReflection with xamarin.forms
Reflection with xamarin.forms
 
独りガラパゴス開発
独りガラパゴス開発独りガラパゴス開発
独りガラパゴス開発
 
エラーハンドリングモデル考察
エラーハンドリングモデル考察エラーハンドリングモデル考察
エラーハンドリングモデル考察
 
C++プログラマの為のセキュリティ入門
C++プログラマの為のセキュリティ入門C++プログラマの為のセキュリティ入門
C++プログラマの為のセキュリティ入門
 
マスタリング バベル
マスタリング バベルマスタリング バベル
マスタリング バベル
 
並列プログラミング 入門!&おさらい!
並列プログラミング入門!&おさらい!並列プログラミング入門!&おさらい!
並列プログラミング 入門!&おさらい!
 
バグベアード入門
バグベアード入門バグベアード入門
バグベアード入門
 
LUCIFERの設計コンセプトと 導入予定の機能紹介
LUCIFERの設計コンセプトと 導入予定の機能紹介LUCIFERの設計コンセプトと 導入予定の機能紹介
LUCIFERの設計コンセプトと 導入予定の機能紹介
 

Recently uploaded

Recently uploaded (7)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

C++ tips2 インクリメント編