printf ("%d \n", 2 > !3 && 4 - 1 != 5 || 6 ) ;
誰かがこれがどのように評価されるか説明できますか? 私が最も混乱しているのは!
、3の前の記号です...評価方法は2 > !3
?
printf ("%d \n", 2 > !3 && 4 - 1 != 5 || 6 ) ;
誰かがこれがどのように評価されるか説明できますか? 私が最も混乱しているのは!
、3の前の記号です...評価方法は2 > !3
?
! 論理否定です。つまり、0 の場合は 1、その他の値の場合は 0 を返します。
!0 == 1
!1 == 0
!897489 == 0
したがって、あなたの例で2 > !3
は評価さ2 > 0
れます1
あなたの表現全体のために、あなたは持っているでしょう
2 > !3 && 4 - 1 != 5 || 6
2 > 0 && 3 != 5 || 6
1 && 1 || 6 && is higher precedence || but some compiler will warn (gcc)
1 || 6 the 6 will not be evaluated (touched) because of short-circuit evaluation
1
以下は、演算子の優先順位の表です。これから、あなたの表現でそれを推測することができます
!
優先順位が最も高い-
次に来る>
次に来る!=
次に来る&&
次に来る||
次に来る!
論理的でない!0 == 1
、を意味し!anythingElse == 0
ます。
式は次のように評価されます。
((2 > (!3)) && ((4 - 1) != 5)) || 6
通常、オペランドの評価順序は指定されていないため、
2 > !3
コンパイラは、評価!3
する前に自由に評価できます2
ただし、&& と || については、ショート サーキットを使用できるように、常に左側が最初に評価され&&
ます (左側が偽 (0) の場合は右側が評価されず||
、左側が真 (何か) の場合は右側が評価されます)。ただし 0)、右側は評価されません)。上記では6
、 の左側||
が true であるため、 は評価されません。と
6 || ((2 > (!3)) && ((4 - 1) != 5))
6 は true であるため、右側は評価されません。
括弧を使用して独自の順序を設定することをお勧めします。それ以外の場合、演算子の優先順位はC Operator Precedence Tableで説明されています。
上記のリンクから:
!3
2 > !3
!2>!3 は 2>0 を意味し、これは常に true であり、4-1 は 3 に等しく、5||6 には等しくありません。5||6 は常に 1 を返すので、コマンド全体で print 1