■ |と||の違い
#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