論理演算子
論理演算子は被演算子に標準的なブール代数演算を適用します。
| 演算子 | 演算子の名前 | 例 | 結果 |
|---|---|---|---|
!
|
論理否定 | !a
|
a の論理否定。 |
&&
|
論理積 | a && b
|
a と b の論理積。 |
||
|
論理和 | a || b
|
a と b の論理和。 |
論理否定
論理否定式は以下の形式を持ちます。
! expression
|
|||||||||
ただし、
| expression | - | 任意のスカラー型の式。 |
論理否定演算子は 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; // 二重感嘆符。 任意の整数を [0, 1] に対応付ける、
// 一般的な C のイディオムです (すべての非ゼロの値が 1 になります)。
char *a[2] = {"nonspace", "space"};
printf("%s\n", a[x]); // int 2個の配列のインデックスとして安全に x を使用できます。
}
出力:
!(2+2==4) = false
nonspace
論理積
論理積式は以下の形式を持ちます。
lhs && rhs
|
|||||||||
ただし、
| lhs | - | 任意のスカラー型の式。 |
| rhs | - | 任意のスカラー型の式。 lhs が 0 と等しくない場合にのみ評価されます。
|
論理積演算子は 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; // 真
1 > 2 && puts("this won't print");
char *p = "abc";
if(p && *p) // 一般的な C のイディオム。
// p がヌルでなく、かつ、 p が文字列の終わりを指さない場合
// (短絡評価のおかげで、
// ヌルポインタを逆参照する恐れはありません)、
// ... // ... 何らかの文字列処理を行います。
}
}
論理和
論理和式は以下の形式を持ちます。
lhs || rhs
|
|||||||||
ただし、
| lhs | - | 任意のスカラー型の式。 |
| rhs | - | 任意のスカラー型の式。 lhs が 0 と等しい場合にのみ評価されます。
|
論理和演算子は 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; // 真
printf("true or false = %s\n", b ? "true" : "false");
// 論理和は Perl の「or die」と似たように使用できます (rhs がスカラー型の場合のみ)。
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 standard (ISO/IEC 9899:2011):
- 6.5.3.3 Unary arithmetic operators (p: 89)
- 6.5.13 Logical AND operator (p: 99)
- 6.5.14 Logical OR operator (p: 99)
- C99 standard (ISO/IEC 9899:1999):
- 6.5.3.3 Unary arithmetic operators (p: 79)
- 6.5.13 Logical AND operator (p: 89)
- 6.5.14 Logical OR operator (p: 89)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.3.3.3 Unary arithmetic operators
- 3.3.13 Logical AND operator
- 3.3.14 Logical OR operator
関連項目
| 一般的な演算子 | ||||||
|---|---|---|---|---|---|---|
| 代入 | インクリメント デクリメント |
算術 | 論理 | 比較 | メンバアクセス | その他 |
|
|
|
|
|
|
|
|
関連項目
論理演算子 の C++リファレンス
|