名前空間
変種

論理演算子

提供: cppreference.com

論理演算子は被演算子に標準的なブール代数演算を適用します。

演算子 演算子の名前 結果
! 論理否定 !a a の論理否定。
&& 論理積 a && b ab の論理積。
|| 論理和 a || b ab の論理和。

論理否定

論理否定式は以下の形式を持ちます。

! 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 - 任意のスカラー型の式。 lhs0 と等しくない場合にのみ評価されます。

論理積演算子は int 型であり、値は lhsrhs が両方ゼロと等しくない場合は 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 - 任意のスカラー型の式。 lhs0 と等しい場合にのみ評価されます。

論理和演算子は int 型であり、値は lhs または rhs のいずれかがゼロと等しくない場合は 1 です。 そうでなければ (lhsrhs の両方がゼロと等しい場合) 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

関連項目

演算子の優先順位

一般的な演算子
代入 インクリメント
デクリメント
算術 論理 比較 メンバアクセス その他

a = b a += b a -= b a *= b a /= b a %= b a &= b a |= b a ^= b a <<= b a >>= b

++a --a a++ a--

+a -a a + b a - b a * b a / b a % b ~a a & b a | b a ^ b a << b a >> b

!a a && b a || b

a == b a != b a < b a > b a <= b a >= b

a[b] *a &a a->b a.b

a(...) a, b (type) a ? : sizeof _Alignof (C11以上)

関連項目

論理演算子C++リファレンス