その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

演算子の優先順位で勘違いしてたこと

!(not演算子)は、>(比較演算子)よりも優先順位が高い

ってご存知でした?


僕はつい最近気づきました。
びびりました、なんせ挙動かわっちゃうので。。


どういうことかというと

NSArray型のarrという変数があるとして、

if (![arr count] > 4) {
	return NO;
}
return YES;


は、

if (!([arr count] > 4)) {
	return NO;
}
return YES;


とは結果が違います。


!(not演算子)は、比較演算子よりも先に処理されるからです。


試してみましょう

NSLog(@"arr:%@",arr);
NSLog(@"test:%d", ![arr count] > 0);
NSLog(@"test:%d", !([arr count] > 0));
NSLog(@"test:%d", ![arr count] > 4);
NSLog(@"test:%d", !([arr count] > 4));


(実行結果)

arr:(
)
test:1
test:1
test:0
test:1


0と比較するときにはたまたま結果が同じになるので
今まで意識することがなかったのかもしれません。



知ってる人にとっちゃ当たり前すぎることなのかもしれないけど、
"!"って"-"とか"+"みたいに符号的な感覚で使っちゃってたので、
僕以外にも勘違いしてる人いるんじゃないかと。



ちなみに余談ですがなぜ

if ([arr count] <= 4) {
	return NO;
}
return YES;

としてないのかというと、
arrを初期化してない場合の[arr count]の挙動まで把握してないので
(そういうのって言語仕様ちゃんと調べて把握したつもりでも
コンパイラやら実行環境やらで変わったりする気がして)
「正常条件以外はすべて弾く」という考え方で上記のように書いております。



(参考)演算子の優先順位
http://www.cppreference.com/wiki/jp/operator_precedence