printf ("%d \n", 2 > !3 && 4 - 1 != 5 || 6) ;
これはどのように評価されるのですか?私が最も混乱しているのは、3の正面にある!
シンボルです... 2 > !3
の評価方法は?Cでの演算子の優先順位
printf ("%d \n", 2 > !3 && 4 - 1 != 5 || 6) ;
これはどのように評価されるのですか?私が最も混乱しているのは、3の正面にある!
シンボルです... 2 > !3
の評価方法は?Cでの演算子の優先順位
! signはバイナリで0の値を変換するので、2>!3は2> 0を意味し、これは常に真であり、4-1は3に等しくなく、5 || 6に等しくありません。 5 || 6はあなたに1を与えるのでコマンド全体が印刷されます1
'!|'の前に '||'が評価されていると確信しています。その行のために –
oops.sorry :) – Ankur
!論理的ではない。それは、他の値に対して0または0の場合は1を返します。
!0 == 1
!1 == 0
!897489 == 0
だからあなたの例では2 > !3
はあなたがここに
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
がoperator precedenceのテーブルである必要がありますあなたの全体の発現のために1
ある2 > 0
をevalutedされます。このことから、我々は
!
あなたの式の中では、最も高い優先-
は、次の>
を来たことを推測することができ、次!=
次&&
は、次の||
来る来る来ます次に来る!
は論理NOTを意味する。!0 == 1
,!anythingElse == 0
。
式が一般的に
((2 > (!3)) && ((4 - 1) != 5)) || 6
として評価され、コンパイラは2
を評価する前に!3
を評価することは自由である
2 > !3
の場合のように、オペランドの評価の順序は、指定されていません
しかし、& &と||の場合、左側i左辺が真(0以外)の場合は||
となり、右辺が評価されない場合は&&
(左辺が偽(0)の場合、右辺は0)、右辺は偽評価される)。上記の場合、||
の左側が真であるため、6
は評価されません。
6 || ((2 > (!3)) && ((4 - 1) != 5))
6は真であるため、右辺は評価されません。
Cの演算子優先順位表を参照して、自分で回答を見つけてください。 –