Namespaces
Variants

Logical operators

From cppreference.net

論理演算子は標準的なブール代数演算をそのオペランドに適用します。

演算子 演算子名 結果
! 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 + = 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
a ? b : c
sizeof


_Alignof
(C11以降)
(C23まで)

alignof
(C23以降)

関連項目

C++ドキュメント for 論理演算子