条件式の注意点
基本だけど忘れ易いことを思い出したのでメモする.
- (a OR b) と (b OR a) の違いについて.
基本的に条件式は左の要素から評価される.例えば (a OR b) では,a が偽であるとき初めて b が評価される.
だから,"a が NULL であるか,そうでなければ b が 0 のとき真" になる条件式は ( a == NULL OR b == 0 ) になるが,これを ( b == 0 OR a == NULL ) と書いてはいけない(場合がある).後者は "b が 0 であるか,そうでなければ NULL のとき真"になる条件式であって,前者とは少し意味が変わる.たとえば a が int のポインタだったとき,b を a が示す値 (*a) とすると ( a == NULL OR *a == 0 ) は正しいが,もし ( *a == 0 OR a == NULL ) と書いてしまったら Bus error になる.
当たり前ですが忘れ易いのでメモしておきました.以下のコードで検証できます.
#include <stdio.h> int main (void){ int *a; a = NULL; if( a == NULL || *a == 0 ){ // if( *a == 0 || a == NULL ){ // Cause of bus error. printf("a is NULL or *a is zero.\n"); }else{ printf("a is %p and *a is %d\n", a, *a); } return 0; }
2008.12.3 id:invent に星もらった.ありがたい.