1

では、2 つの別個のコード フラグメントに対して、インクリメンタ/デクリメンタの動作が異なるのはなぜでしょうか?

フラグメント A:

i=7; j=8; k=9; 
printf("%d\n", i - 7 && j++ > k);
printf("%d %d %d", i, j, k);

次の出力が生成されます。

0
7 8 9

フラグメント B:

while (i > 0)
printf("T minus %d and counting\n",i--);

これを生成します:

T minus 5 and counting
T minus 4 and counting
T minus 3 and counting
T minus 2 and counting
T minus 1 and counting

jこれで、関数への引数が値で渡されること、およびブール式で使用されるという事実と何らかの関係があるに違いないことがわかりました。しかし、この 2 つの状況は矛盾しているように思えます。何が起きてる?

4

4 に答える 4

7

さて、あなたは演算子の優先順位がどのように配置されているか、そしてそれらがどのように機能するかを非常に注意深く見る必要があるでしょう。これは宿題なので、正確な答えは出さないが、2つのことをしなければならない。

  1. 優先順位テーブルを使用して、完全な括弧で式を書き直します
  2. 正確な動作を調べます&&。特に、部分式はいつj++ > k実行されますか?
于 2012-05-17T00:52:31.070 に答える
2

それは短絡と呼ばれます。&&の左手が偽物であると評価された場合、右側はもう実行されません(スキップされます)。

于 2012-05-17T00:52:50.390 に答える
1

ここで短絡が発生しています(&&)。式の左側のみが評価されます。

于 2012-05-17T00:53:11.840 に答える
0

フラグメント A:

">" は "&&" よりも優先度が高いため、

printf("%d\n", i - 7 && j++ > k); 

このような:

printf("%d\n", i - 7 && (j++ > k));

"&&" は短絡演算です。(i - 7) == 0 は FALSE であるため、(j++ > k) は無視され、これら 3 つの数値はすべて変更されません。

フラグメント B:

"i--" は最初に元の値を返し、次にマイナス 1 を返します。

于 2012-05-17T02:27:43.543 に答える