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

誰かがこれがどのように評価されるか説明できますか? 私が最も混乱しているのは!、3の前の記号です...評価方法は2 > !3

4

4 に答える 4

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
于 2011-07-14T13:08:12.567 に答える
2

以下は、演算子の優先順位の表です。これから、あなたの表現でそれを推測することができます

  • !優先順位が最も高い
  • -次に来る
  • >次に来る
  • !=次に来る
  • &&次に来る
  • ||次に来る

!論理的でない!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 であるため、右側は評価されません。

于 2011-07-14T13:22:46.897 に答える
0

括弧を使用して独自の順序を設定することをお勧めします。それ以外の場合、演算子の優先順位はC Operator Precedence Tableで説明されています。

上記のリンクから:

  1. !3

  2. 2 > !3

于 2011-07-14T10:30:22.537 に答える
0

!2>!3 は 2>0 を意味し、これは常に true であり、4-1 は 3 に等しく、5||6 には等しくありません。5||6 は常に 1 を返すので、コマンド全体で print 1

于 2011-07-14T10:35:42.803 に答える