Logical operators
論理演算子は標準的なブール代数演算をそのオペランドに適用します。
| 演算子 | 演算子名 | 例 | 結果 |
|---|---|---|---|
| ! | logical NOT | ! a | a の論理否定 |
| && | logical AND | a && b | a と b の論理積 |
| || | logical OR | a || b | a と b の論理和 |
目次 |
論理NOT
論理NOT式の形式は以下の通りです
!
式
|
|||||||||
ここで
| expression | - | 任意の スカラ型 の式 |
論理NOT演算子の型は int です。その値は、 expression がゼロと比較して等しくない値に評価される場合は 0 です。 expression がゼロと比較して等しい値に評価される場合は、その値は 1 です。(したがって ! E は ( 0 == E ) と同じです)
#include <stdbool.h> #include <stdio.h> #include <ctype.h> int main(void) { bool b = !(2+2 == 4); // 真ではない printf("!(2+2==4) = %s\n", b ? "true" : "false"); int n = isspace('a'); // 'a'が空白文字の場合は非ゼロ、それ以外はゼロ int x = !!n; // "bang-bang"、整数を[0,1]にマッピングする一般的なC言語のイディオム // (すべての非ゼロ値が1になる) char *a[2] = {"non-space", "space"}; puts(a[x]); // これでxを2つの文字列配列のインデックスとして安全に使用できる }
出力:
!(2+2==4) = false non-space
論理積 (Logical AND)
論理AND式の形式は以下の通りです
lhs
&&
rhs
|
|||||||||
ここで
| lhs | - | 任意のスカラー型の式 |
| rhs | - | 任意のスカラー型の式( lhs が 0 と等しくない場合にのみ評価される) |
論理AND演算子は型 int を持ち、 lhs と rhs の両方がゼロと等しくない場合に値 1 を取ります。それ以外の場合( lhs または rhs のいずれか、あるいは両方がゼロと等しい場合)には値 0 を取ります。
lhs の評価の後に シーケンスポイント が存在します。 lhs の結果がゼロと等しい場合、 rhs は評価されません(いわゆる 短絡評価 です)
#include <stdbool.h> #include <stdio.h> int main(void) { bool b = 2+2==4 && 2*2==4; // b == true 1 > 2 && puts("this won't print"); char *p = "abc"; if(p && *p) // 一般的なC言語のイディオム: pがnullでない場合 // かつpが文字列の終端を指していない場合 { // (短絡評価のおかげで、これはnullポインタの // 逆参照を試みないことに注意) // ... // ... 文字列処理を実行 } }
論理OR
論理OR式は以下の形式を持ちます
lhs
||
rhs
|
|||||||||
ここで
| lhs | - | 任意のスカラー型の式 |
| rhs | - | 任意のスカラー型の式( lhs が 0 と等しい場合にのみ評価される) |
論理OR演算子は型 int を持ち、 lhs または rhs のいずれかがゼロと等しくない場合に値 1 を取ります。それ以外の場合( lhs と rhs の両方がゼロと等しい場合)は値 0 を取ります。
lhs の評価の後に シーケンスポイント が存在します。 lhs の結果がゼロと不等である場合、 rhs は全く評価されません(いわゆる 短絡評価 です)
#include <stdbool.h> #include <stdio.h> #include <string.h> #include <errno.h> int main(void) { bool b = 2+2 == 4 || 2+2 == 5; // true printf("true or false = %s\n", b ? "true" : "false"); // logical OR can be used simialar to perl's "or die", as long as rhs has scalar type fopen("test.txt", "r") || printf("could not open test.txt: %s\n", strerror(errno)); }
出力例:
true or false = true could not open test.txt: No such file or directory
参考文献
- C11標準 (ISO/IEC 9899:2011):
-
- 6.5.3.3 単項算術演算子 (p: 89)
-
- 6.5.13 論理AND演算子 (p: 99)
-
- 6.5.14 論理OR演算子 (p: 99)
- C99標準 (ISO/IEC 9899:1999):
-
- 6.5.3.3 単項算術演算子 (p: 79)
-
- 6.5.13 論理AND演算子 (p: 89)
-
- 6.5.14 論理OR演算子 (p: 89)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 3.3.3.3 単項算術演算子
-
- 3.3.13 論理AND演算子
-
- 3.3.14 論理OR演算子
関連項目
| 一般的な演算子 | ||||||
|---|---|---|---|---|---|---|
| 代入 |
インクリメント
デクリメント |
算術 | 論理 | 比較 |
メンバー
アクセス |
その他 |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
b
]
|
a
(
...
)
|
関連項目
|
C++ドキュメント
for
論理演算子
|