Boost.勉強会 #8 大阪 ( 2012-02-11 ) C++ Tips 3 カンマ演算子編.

Slides:



Advertisements
Similar presentations
山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
Advertisements

2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Boost. 勉強会 #6 札幌 ( ). 概要  主に cppll ML でご紹介してきた tips を C++ の仕様をより掘り下げた形でまとめ直し てみました。  今回は #include にフォーカスした内容です。 C++ Tips 1 #include 編 Boost.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
4章 制御の流れ-3.
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎I(再) 山元進.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング論 II 電卓,逆ポーランド記法電卓
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
プログラムの制御構造 選択・繰り返し.
プログラミング2 関数
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
プログラミング論 II 2008年10月30日 文字列
プログラミング 平成23年12月21日 森田 彦.
プログラミング 4 記憶の割り付け.
アルゴリズムとプログラミング (Algorithms and Programming)
木の走査.
知能情報工学演習I 第12回(後半第6回) 課題の回答
04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
第7回課題 フィボナッチ数列 (コード:p.171) について,fib(4) を呼び出したときの起こる出来事は以下の通りである.
PHP 概要 担当 岡村耕二 月曜日 2限 平成22年度 情報科学III (理系コア科目・2年生)
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
アルゴリズムとプログラミング (Algorithms and Programming)
参照されないリテラル 長谷川啓
プログラミング 3 2 次元配列.
3.1 ifステートメント 3.2 if-elseステートメント 3.3 コードのブロック 11月14日(金) 発表者:藤井丈明
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
情報処理Ⅱ 第3回 2007年10月22日(月).
プログラミングⅡ 第2回.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
C#プログラミング実習 第3回.
第5回 プログラミングⅡ 第5回
高度プログラミング演習 (11).
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
第5章 まだまだ続く反復処理!! ~繰り返しその2 for~
情報処理Ⅱ 2005年10月28日(金).
第4章 double 小数型の変数;.
コンパイラ 2012年10月11日
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
フレンド関数とフレンド演算子.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
演算子のオーバーロード.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報処理Ⅱ 2005年11月25日(金).
情報処理Ⅱ 小テスト 2005年2月1日(火).
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
C言語講座 四則演算  if ,  switch 制御文.
6.3 インタプリタ (1)インタプリタ(interpreter)とは
情報処理Ⅱ 2006年10月27日(金).
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
プログラミング 2 静的変数.
Presentation transcript:

Boost.勉強会 #8 大阪 ( 2012-02-11 ) C++ Tips 3 カンマ演算子編

概要 主に cppll ML でご紹介してきた tips をC++ の仕様をより掘り下げた形でまとめ直し てみました。 今回はカンマ演算子にフォーカスした内 容です。 C++ Tips Boost.勉強会 #8 大阪

C++ Tips カンマ演算子

カンマ演算子ってなに? セミコロン(;)が文の区切りとして使える ように、カンマ(,)が文節として使えます。 日本語文章で例えると「;」が「 。 」に対応するのに対して「,」は「、」に対応しています。 この用法で使われるカンマはカンマ演算 子と呼ばれます。 C++ Tips Boost.勉強会 #8 大阪

カンマ演算子ってなに? 関数呼び出しのカンマや初期化ブロック 内のカンマ区切りはカンマ演算子ではあ りません。 関数呼び出しのカンマ区切りと違って評 価順は左側の項目が先と決まってます。 カンマ演算子はもっとも優先順位の低い 演算子となります。 C++ Tips Boost.勉強会 #8 大阪

カンマ演算子の動き int a() { puts("a"); return 1; } int b() { puts("b"); return 2; } int c() { puts("c"); return 4; } void func() { int x = (a(),b(),c()); printf("%d\n",x); } ■実行結果 a b c 4 左から順に評価され最も右側の値が式の評価値となり ます。( オーバーロードされていない場合 ) C++ Tips Boost.勉強会 #8 大阪

余談というか落とし穴 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 大阪

使用例:if if (a(),b(),c()) // c()結果で分岐 { ... } else if (d(),e(),f()) // f()結果で分岐 if (g(),h(),i()) // i()結果で分岐 C++ Tips Boost.勉強会 #8 大阪

使用例:if if (x=a(),b(x),c()) // c()の結果で分岐 { ... } else if (d(),e=x+i,f(e)) // f(e)の結果で分岐 if (g(),i=h(),i++) // i++の結果で分岐 C++ Tips Boost.勉強会 #8 大阪

使用例:switch if (a(),b(),c()) // c()の結果で分岐 { ... } else switch(d(),e(),f()) // f()の結果で分岐 { case 0: ... default: } C++ Tips Boost.勉強会 #8 大阪

使用例:while,do/while while(a(),b(),c()) // c()の結果で分岐 { ... } do while(d(),e(),f()); // f()の結果で分岐 C++ Tips Boost.勉強会 #8 大阪

使用例:for for(int i=0,j=0; a(i),b(j); c(&i),d(&j)) { ... } // b()の結果で分岐 ※最初のカンマはカンマ演算子ではなく宣言のカンマ区切りとなります。 C++ Tips Boost.勉強会 #8 大阪

使用例:引数 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 大阪

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

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

スタック領域の圧迫について カンマ演算子を多用して頑張ると一文で 結構な量のコードが書けてしまうのです が、あんまり調子扱いてると一時変数の 量が膨大になってスタック領域を圧迫し 状況によってはスタックオーバーフロー を招くことにもなりかねない観点からも ほどほどに。 C++ Tips Boost.勉強会 #8 大阪

インラインロック カンマ演算子は左側の項目から評価され るという事と、一時オブジェクトの寿命 は文の終了時までという事を利用し、コ ンストラクタでロック、デスクトラクタ でアンロックを行うクラスを用意してお けばインラインでの手軽なロック/アン ロックができます。 C++ Tips Boost.勉強会 #8 大阪

インラインロック auto_lock(),func(); ■実行される順番 1.auto_lock::auto_lock() C++ Tips Boost.勉強会 #8 大阪

インラインロック 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 大阪

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

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

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

C++ Tips 質疑応答

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