SlideShare ist ein Scribd-Unternehmen logo
1 von 24
Boost.勉強会 #8 大阪 ( 2012-02-11 )

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


               C++ Tips Boost.勉強会 #8 大阪   2
C++ Tips

カンマ演算子
カンマ演算子ってなに?
 セミコロン(;)が文の区切りとして使える
 ように、カンマ(,)が文節として使えます。
  日本語文章で例えると「;」が「 。 」に対応
 するのに対して「,」は「、」に対応してい
 ます。
 この用法で使われるカンマはカンマ演算
 子と呼ばれます。
            C++ Tips Boost.勉強会 #8 大阪   4
カンマ演算子ってなに?
 関数呼び出しのカンマや初期化ブロック
  内のカンマ区切りはカンマ演算子ではあ
  りません。
 関数呼び出しのカンマ区切りと違って評
  価順は左側の項目が先と決まってます。
 カンマ演算子はもっとも優先順位の低い
  演算子となります。
         C++ Tips Boost.勉強会 #8 大阪   5
カンマ演算子の動き
int a() { puts("a"); return 1; }                  ■実行結果
int b() { puts("b"); return 2; }                  a
int c() { puts("c"); return 4; }                  b
void func() {                                     c
  int x = (a(),b(),c());                          4
  printf("%dn",x);
}
  左から順に評価され最も右側の値が式の評価値となり
   ます。( オーバーロードされていない場合 )
                       C++ Tips Boost.勉強会 #8 大阪           6
余談というか落とし穴
int x = (a(),b(),c());
…のつもりで…
int x = a(),b(),c();
…と書くとカンマ演算子ではなく、宣言のカンマ区切り
だとコンパイラに解釈され…
int x = a(); // a() を実行して x に初期値にする。
int b(); // 戻り型が int の関数 b() の宣言。
int c(); // 戻り型が int の関数 c() の宣言。
…の意味になってしまいます。
                C++ Tips Boost.勉強会 #8 大阪   7
使用例:if
if (a(),b(),c()) // c()結果で分岐
{ ... }
else
if (d(),e(),f()) // f()結果で分岐
{ ... }
else
if (g(),h(),i()) // i()結果で分岐
{ ... }
else
{ ... }                C++ Tips Boost.勉強会 #8 大阪   8
使用例:if
if (x=a(),b(x),c()) // c()の結果で分岐
{ ... }
else
if (d(),e=x+i,f(e)) // f(e)の結果で分岐
{ ... }
else
if (g(),i=h(),i++) // i++の結果で分岐
{ ... }
else
{ ... }                C++ Tips Boost.勉強会 #8 大阪   9
使用例:switch
if (a(),b(),c()) // c()の結果で分岐
{ ... }
else
switch(d(),e(),f()) // f()の結果で分岐
{
case 0:
  ...
default:
  ...
}                      C++ Tips Boost.勉強会 #8 大阪   10
使用例:while,do/while
while(a(),b(),c()) // c()の結果で分岐
{ ... }

do
{ ... }
while(d(),e(),f()); // f()の結果で分岐



                   C++ Tips Boost.勉強会 #8 大阪   11
使用例:for
for(int i=0,j=0; a(i),b(j); c(&i),d(&j))
{ ... } // b()の結果で分岐

※最初のカンマはカンマ演算子ではなく宣言のカンマ区
切りとなります。




                       C++ Tips Boost.勉強会 #8 大阪   12
使用例:引数
x((a(),b(),c()), (d(),e(),f()), (g(),h(),i()));


 この場合、( )各グループ内では… a()→b()→c()、
  d()→e()→f()、 g()→h()→i() …の順で実行されます
  が、abc、def、ghiの各グループの実行される順番は処理
  系依存となる為、処理系によって abc→def→ghi だった
  り ghi→def→abc だったりします。
    この順番は通常、関数の引数がどのような順番でスタック
    に積まれるか依存します。

                       C++ Tips Boost.勉強会 #8 大阪   13
使用例:|| と && 組み合わせて
(
  (a(),b(),c()) ||
  (d(),e(),f()) // c()がfalseの場合に実行
) && (g(),h(),i()); // c()||f()がtrueの場合に実行




                    C++ Tips Boost.勉強会 #8 大阪   14
\ ヒャッハー! /
int x = (
  (++i,y=a(),b(y),c(i)) ||
  (++i,y=d(),e(i),z=f(y,i) ? g(): h())
) && (
 (++i,y=a(),b(y),c(i)) ||
 (++i,y=d(),e(i),y<=f(y,i))
);



                       C++ Tips Boost.勉強会 #8 大阪   15
スタック領域の圧迫について
 カンマ演算子を多用して頑張ると一文で
結構な量のコードが書けてしまうのです
が、あんまり調子扱いてると一時変数の
量が膨大になってスタック領域を圧迫し
状況によってはスタックオーバーフロー
を招くことにもなりかねない観点からも
ほどほどに。
         C++ Tips Boost.勉強会 #8 大阪   16
インラインロック
 カンマ演算子は左側の項目から評価され
るという事と、一時オブジェクトの寿命
は文の終了時までという事を利用し、コ
ンストラクタでロック、デスクトラクタ
でアンロックを行うクラスを用意してお
けばインラインでの手軽なロック/アン
ロックができます。
         C++ Tips Boost.勉強会 #8 大阪   17
インラインロック
auto_lock(),func();

  ■実行される順番
  1.auto_lock::auto_lock()
  2.func()
  3.auto_lock::~auto_lock()



                      C++ Tips Boost.勉強会 #8 大阪   18
インラインロック
if (auto_lock(),func()) { func2(); }

  ■実行される順番
  1.auto_lock::auto_lock()
  2.func()
  3.auto_lock::~auto_lock()
  4.func2() →func()がtrueの場合にのみ実行される。


                     C++ Tips Boost.勉強会 #8 大阪   19
オーバーロード
 カンマ演算子はオーバーロードしてその
挙動をユーザー定義することも可能です。
 inline hoge operator,(hoge a, hoge b) {
   return a; // b の代わりに a を返す。
 }



                   C++ Tips Boost.勉強会 #8 大阪   20
初期化リスト代わり
 カンマ演算子のオーバーロードを頑張れ
ばC++11の初期化リストの代わりになるよ
うな類いのもの実装可能です。




         C++ Tips Boost.勉強会 #8 大阪   21
オーバーロード 注意点
 その他演算子オーバーロード違い、カンマ演算子の
  オーバーロードは見た目からはオーバーロードされて
  いることが予測し辛い為、容易くメンテナンス性の悪
  いコードになってしまいますので、乱用は厳禁です。
 C++03時代であればまだ初期化リスト代わりの用途とし
  てカンマ演算子のオーバーロードが有効なシーンも
  あったもののC++11では素直に初期化リストを使ったほ
  うがいいです。
 さらにC++03でも昔のコンパイラではカンマ演算子の
  オーバーロードまわりはコンパイラの挙動がバギーで
  使い物にならなかったり・・・
             C++ Tips Boost.勉強会 #8 大阪   22
C++ Tips

質疑応答
C++ Tips

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

Weitere ähnliche Inhalte

Was ist angesagt?

すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界
maruyama097
 

Was ist angesagt? (20)

競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
最新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月)
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Python
 
「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
Boost Fusion Library
Boost Fusion LibraryBoost Fusion Library
Boost Fusion Library
 

Andere mochten auch

猫にはわからない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
 

Andere mochten auch (20)

C++ tips2 インクリメント編
C++ tips2 インクリメント編C++ tips2 インクリメント編
C++ tips2 インクリメント編
 
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
 
C++ tips1 #include編
C++ tips1 #include編C++ tips1 #include編
C++ tips1 #include編
 
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
 
わんくま同盟大阪勉強会#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的に)
 
猫にはわからない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テーマを共同編集しよう〜
 
Catalogue HOP'TOYS Autonomie 2017
Catalogue HOP'TOYS Autonomie 2017Catalogue HOP'TOYS Autonomie 2017
Catalogue HOP'TOYS Autonomie 2017
 
Turkey is a New Kind Of Silicon Valley
Turkey is a New Kind Of Silicon ValleyTurkey is a New Kind Of Silicon Valley
Turkey is a New Kind Of Silicon Valley
 

Ähnlich wie C++ tips 3 カンマ演算子編

C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
sunaemon
 
Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
digitalghost
 
Lambda in template_final
Lambda in template_finalLambda in template_final
Lambda in template_final
Cryolite
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
Shota Baba
 

Ähnlich wie C++ tips 3 カンマ演算子編 (20)

C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
 
C++ tips4 cv修飾編
C++ tips4 cv修飾編C++ tips4 cv修飾編
C++ tips4 cv修飾編
 
More C++11
More C++11More C++11
More C++11
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
 
Lambda in template_final
Lambda in template_finalLambda in template_final
Lambda in template_final
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
C++の復習
C++の復習C++の復習
C++の復習
 
マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門
マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門
マイクロマウスのための MATLAB/Simulink 講座 第1回 - MATLAB入門
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Hupc 1
Hupc 1Hupc 1
Hupc 1
 
C++勉強会in広島プレゼン資料
C++勉強会in広島プレゼン資料C++勉強会in広島プレゼン資料
C++勉強会in広島プレゼン資料
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
講座C入門
講座C入門講座C入門
講座C入門
 
C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 

Mehr von 道化師 堂華

Mehr von 道化師 堂華 (9)

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

Kürzlich hochgeladen

Kürzlich hochgeladen (7)

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

C++ tips 3 カンマ演算子編