演算子の優先順位で勘違いしてたこと
!(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