6. カンマ演算子の動き
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
7. 余談というか落とし穴
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
8. 使用例:if
if (a(),b(),c()) // c()結果で分岐
{ ... }
else
if (d(),e(),f()) // f()結果で分岐
{ ... }
else
if (g(),h(),i()) // i()結果で分岐
{ ... }
else
{ ... } C++ Tips Boost.勉強会 #8 大阪 8
9. 使用例: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
10. 使用例:switch
if (a(),b(),c()) // c()の結果で分岐
{ ... }
else
switch(d(),e(),f()) // f()の結果で分岐
{
case 0:
...
default:
...
} C++ Tips Boost.勉強会 #8 大阪 10