条件式の注意点

基本だけど忘れ易いことを思い出したのでメモする.

  • (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 に星もらった.ありがたい.