2011-07-14 11 views
1
printf ("%d \n", 2 > !3 && 4 - 1 != 5 || 6) ; 

これはどのように評価されるのですか?私が最も混乱しているのは、3の正面にある!シンボルです... 2 > !3の評価方法は?Cでの演算子の優先順位

+3

Cの演算子優先順位表を参照して、自分で回答を見つけてください。 –

答えて

0

括弧を使用して独自の注文を行うことをお勧めします。それ以外の場合は、演算子の優先順位はC Operator Precedence Tableで説明されています。上記のリンクから

:!!

  1. 2> 3

0

! signはバイナリで0の値を変換するので、2>!3は2> 0を意味し、これは常に真であり、4-1は3に等しくなく、5 || 6に等しくありません。 5 || 6はあなたに1を与えるのでコマンド全体が印刷されます1

+0

'!|'の前に '||'が評価されていると確信しています。その行のために –

+0

oops.sorry :) – Ankur

3

!論理的ではない。それは、他の値に対して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 
2

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は真であるため、右辺は評価されません。

関連する問題