-2

この場合、なぜprintf()呼び出されないのですか?その場合に使用できます&&か?

{ 
   int zz1,zz2;
   zz1 = 8;
   zz2= zz1 / 2;
   if ( (zz1==! 0 ) && (zz2 ==! 1 ) ){
      printf("!!!!!!!!!!");
   }
}
4

4 に答える 4

1

==!単一の演算子ではなく、実際には 2 つの演算子として解析されます。これは==!コンパイラが常に最も長いトークンを選択するためです。そしてzz1==!0 、実際にzz1 == !0です。

注:!0は論理否定ゼロ、つまり==> 1 です。

条件が次の場合のコード:

  1. zz1 == !0 ==> zz1 == 1 ==> 8 == 1 ==> Falseまたは 0
  2. そして0 && any expression ==> False短絡評価による)。
  3. したがって、条件が false の場合、printf は呼び出されません。

printf をelse句に追加すると、それが実行されます。チェック@ideone .

&&さらに、偶数で置き換えると、 and ==> ==> ==> ==> 0 ||であるため、コードで printf() 関数が呼び出されないとします。zz2 = 4zz2 ==! 1 zz2 == !1 zz2 == 0 4 == 0

そのため、0 || 0 == 0if 条件が false になります。

于 2013-07-31T15:06:29.770 に答える
1

私はあなたが書くと思います(zz1 != 0 ) && (zz2 != 1 )

実際(zz1 == !0 ) && (zz2 == !1 )には有効な構文ですが、この場合、次のように記述しているため、望ましくない結果が生成されます。

  1. zz1 equals to (not)0 AND zz2 equals to (not)1
  2. あれはzz1 equals to 1 AND zz2 equals to 0
  3. これは false であるため、printfは呼び出されません
于 2013-07-31T15:01:46.207 に答える
0

多分あなたは書きたかった(zz1 != 0) && (zz2 != 1)ですか?

于 2013-07-31T15:03:54.483 に答える