【C言語】
|演算子と||演算子の違いは
短絡評価の扱い

ビット単位のOR演算子【|】と 論理OR演算子【||】の違い

#include <stdio.h>
int main(void){
    /*
        0xFF00
        0x00ff
    ------
        0xFFff
    */
    printf("ビット演算  %x\n",0xFF00 |  0xFF);
    
    /*
        0xFF00||0xFF
        ⇒非ゼロ||非ゼロ
        ⇒真||真
        ⇒真
        ⇒1
    */
    printf("論理演算    %x\n",0xFF00 || 0xFF);
}

●実行結果

./a.out
ビット演算  ffff
論理演算    1

■短絡評価有無の違い

#include    <stdio.h>
#include    <stdbool.h>
bool Ltrue(void){
    printf("左⇒");
    return  true ;  
}
bool Rfalse(void) {   
    printf("右⇒");
    return  false ; 
}
int main(void){
    //ビット演算
    if(Ltrue() | Rfalse())  puts("両辺実行");
    else                    puts("来ない");   
    
    //論理演算
    if(Ltrue() || Rfalse()) puts("左辺のみ実行");
    else                    puts("来ない");
}

●Ltrue() | Rfalse() 

|はビット演算子なので
両辺の関数は必ず呼ばれる(評価される)
1|0=1=真なのでthen節が表示される。

●Ltrue() || Rfalse()

||は論理演算子なのでLtrue()が成立した時点でif文は成立する。

このためRfalse()を呼ぶ必要が無い
(Rfalse()を評価する必要が無い)

これを「ショートサーキット動作」
短絡評価と言う。

●実行結果

./a.out
左⇒右⇒両辺実行
左⇒左辺のみ実行

参考:

EXP02-C. 論理 AND 演算子および論理 OR 演算子のショートサーキット動作について注意する

https://www.jpcert.or.jp/sc-rules/c-exp02-c.html