CH3COOH(酢酸)のさくっと393

VB.NET(VS2003)でお仕事中.Windows Mobile大好きです。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  413  : 記事  0  : コメント  7776  : トラックバック  93

ニュース

CH3COOH(酢酸)の実験室 or SOFTBUILD

書庫

日記カテゴリ

三項演算子は上から評価される

え……マジで?、と思ってやってみました。

	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"から評価されてる!納得出来たっ!!

 

どうでも良い話ですが、

pStr char* = 0

って書いてしまった僕はもう立派なVB脳。
あ、セミコロンも付けれなくなってました。

投稿日時 : 2008年9月2日 20:40

コメント

# re: [C/C++]三項演算子は上から評価されてた! 2008/09/02 21:37 CH3COOH(酢酸)
このエントリを書いた後、
TwitterでPHPは内側から評価するよって教えてもらったー。
http://d.hatena.ne.jp/pasela/20080524/ternary

あと、C/C++の
if((strMessage != NULL) && (strlen(strMessage) > 0))
を表現したい場合、
VBではAndじゃなくて、AndAlsoを使う事も合わせて学習した!!

# re: [C/C++]三項演算子は上から評価されてた! 2008/09/03 10:24 R・田中一郎
アセンブラでも、先頭から順に実行しているんですね~

>VBではAndじゃなくて、AndAlsoを使う事も合わせて学習した!!

VB のショートサーキットってわかりにくいですよね^^;

Post Feedback

タイトル
名前
Url:
コメント