三項演算子は上から評価される
え……マジで?、と思ってやってみました。
char* pStr = 0;
int i = 1;
pStr = i==1 ? "one" :
i==2 ? "two" :
i==3 ? "three" :
i==1 ? "一" : "一杯";
printf("%s", pStr);
わっ、本当だ。"one"って表示されてる。
何重にも三項演算子(条件演算子?)を使うと、可読性が急激に落ちるので、
return bIsHoge ? SUCCESS: FALIED;
こんな使い方しかしたことないけど、漠然と内側から評価されるのかと思ってました。
……ん?あれ?内側?
コードを内側から展開してみました。
pStr = i==1 ? "one" :(i==2 ? "two" :(i==3 ? "three":(i==1 ? "一" : "一杯")));
pStr = i==1 ? "one" :(i==2 ? "two" :(i==3 ? "three": "一"));
pStr = i==1 ? "one" :(i==2 ? "two" : "一");
pStr = i==1 ? "one" : "一";
pStr = "one";
あれれ?結局、"one"が吐かれるじゃ?
なんだか納得が行かなかったので、アセンブラコードを見てみました。
pStr = i==1 ? "one" :(i==2 ? "two" :(i==3 ? "three":(i==1 ? "一" : "一杯")));
004135EC cmp dword ptr [i],1
004135F0 jne wmain+3Eh (4135FEh)
004135F2 mov dword ptr [ebp-0DCh],offset string "one" (415754h)
004135FC jmp wmain+0A2h (413662h)
004135FE cmp dword ptr [i],2
00413602 jne wmain+50h (413610h)
00413604 mov dword ptr [ebp-0E0h],offset string "two" (415750h)
0041360E jmp wmain+96h (413656h)
00413610 cmp dword ptr [i],3
00413614 jne wmain+62h (413622h)
00413616 mov dword ptr [ebp-0E4h],offset string "three" (4157B8h)
00413620 jmp wmain+8Ah (41364Ah)
00413622 cmp dword ptr [i],1
00413626 jne wmain+74h (413634h)
00413628 mov dword ptr [ebp-0E8h],offset string "\x88\xea" (415748h)
00413632 jmp wmain+7Eh (41363Eh)
00413634 mov dword ptr [ebp-0E8h],offset string "\x88\xea\x94t" (415740h)
0041363E mov eax,dword ptr [ebp-0E8h]
00413644 mov dword ptr [ebp-0E4h],eax
0041364A mov ecx,dword ptr [ebp-0E4h]
00413650 mov dword ptr [ebp-0E0h],ecx
00413656 mov edx,dword ptr [ebp-0E0h]
0041365C mov dword ptr [ebp-0DCh],edx
00413662 mov eax,dword ptr [ebp-0DCh]
00413668 mov dword ptr [pStr],eax
おぉ、本当だ。"one"から評価されてる!納得出来たっ!!
どうでも良い話ですが、
って書いてしまった僕はもう立派なVB脳。
あ、セミコロンも付けれなくなってました。