n度あることはn+1度ある

憶測が多いブログなので鵜呑みにしないこと

C言語のifの挙動について

C言語のif文の挙動についてメモ
以下のプログラムにおいて

#include<stdio.h>

int test_func(int);
int main(void){
        int a;
        a = 0;
        if(a && test_func(1))
                printf("true1\n");
        if(test_func(2) && a)
                printf("true2\n"); 
}

int test_func(int jud){
        printf("call no.%d\n",jud);
}

実行結果は
call no.2
一番最初のif文ではaが0のためif内のtest_funcは呼び出されない。ただし二番目のif文のように関数を先に呼び出されるようにすればaが0でも実行される。
つまりif内の項は左から順番に処理され、0が来た瞬間に終わるようになっている。   ここでif内の条件演算をビット演算の&に変えると

call no.1
call no.2

つまり&&の処理はifやwhileなどの制御処理内で左から実行や0のチェックをされているが、ビット演算子も含めその他は一度実行した結果を見て条件分岐をしているといえる。
それがなんだという話であるが、if(a && test_func())のようにif内に関数が含まれるとき、自分より先にある項が0であっても必ず実行したい場合に&&でなく&を使うとできる。
単純な話、項の順序を入れ替えればいいだけだが。