【C言語】
&演算子と&&演算子の違い

■ |と||の違い

#include    <stdio.h>
#include    <stdbool.h>
bool 左辺実行値1(void){
    puts("左");
    return  1 ;  
}
bool 右辺実行値0(void) {   
    puts("右");
    return  0 ; 
}
int main(void){
    if(左辺実行値1() | 右辺実行値0())   
        puts("|⇒両辺実行");
    else                
        puts("ここには来ない");   
    
    if(左辺実行値1() || 右辺実行値0())   
        puts("||⇒短絡動作で右辺は実行されない");
    else                
        puts("ここには来ない");
}

●on()|off() 

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

●on()||off())

||は論理演算子なのでon()が成立した時点でif文は成立する。
このためoff()を呼ぶ必要が無い
(off()を評価する必要が無い)
これを「ショートサーキット動作」=短絡評価と言う。

左
右
|⇒両辺実行
左
||⇒短絡動作で右辺は実行されない

■ &と&&の違い

#include    <stdio.h>
#include    <stdint.h>
uint32_t 左辺実行値1(void){
    puts("左");
    return  1 ;  
}
uint32_t 右辺実行値2(void) {   
    puts("右");
    return  2 ; 
}
int main(void){
    if(左辺実行値1() & 右辺実行値2())   
        puts("ここには来ない");
    else                
        puts("ビット演算\t1&2⇒0⇒偽");   
    
    if(左辺実行値1() && 右辺実行値2())   
        puts("論理演算\t1&&2⇒両辺非ゼロ⇒両辺真⇒真");
    else                
        puts("ここには来ない");
}

●one() & two()

&はビット演算子なので両辺を簡略化すると1&2=0=偽となり
if(偽)は成立しないのでelse節 が表示される

●one() && two()

&&は論理演算子なので両辺を簡略化すると
1&&2=非ゼロ&&非ゼロ=真&&真=真となり
if(真)は成立するのでthen節 が表示される

左
右
ビット演算      1&2⇒0⇒偽
左
右
論理演算        1&&2⇒両辺非ゼロ⇒両辺真⇒真

参考:

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

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