2

以下のコードでは:

#include <stdio.h>

int main()
{
     int a = 1;
     int b = 1;
     int c = a || --b;
     int d = a-- && --b;
     printf("a = %d, b = %d, c = %d, d = %d", a, b, c, d);
     return 0;
}

私は出力が次のようになることを期待していました:

a=0、b=1、c=1、d=0

以下の行で短絡が発生したため、つまり a-- が 0 を返すため、他の部分は正しく実行されませんか?

int d = a-- && --b;

出力は次のとおりです。

a = 0、b = 0、c = 1、d = 0

誰でも説明できますか?

4

6 に答える 6

4
int c = a || --b;

この行では、C 標準では、C 実装が最a​​初に評価し、ゼロでない場合は評価しないこと --bが求められます。--は よりも優先順位が高いですが、これは、式を評価する目的ではなく、式の構造を決定する目的でが とグループ化されて||いることを意味します。演算子の左辺は右辺の前に評価する必要があり、左辺が true の場合、右辺は部分的にでも評価してはなりません。--b||

したがって、上記の後、b変更されません。まだ1です。

int d = a-- && --b;

と同様に||、 の左側&&が最初に評価されます。そうa--評価される。これはa0 に変更されます。ただし、の値はa--変更a前なので 1 です。値が 0 の場合、右側が評価されなくなります (左側がゼロであることがわかったら、完全な&&式はゼロです)。ただし、左辺は 0 ではないため、--bを終了するには を評価する必要があります&&。これはb0 に変更されます。「短絡」とは、左側が最初に評価されることを意味しますが、必要に応じて右側が引き続き評価されます。

于 2013-10-26T12:32:27.043 に答える
4

最初のor演算では、が 1で--bあるため実行されません。a

int c = a || --b;

しかし、bここではデクリメントされます:

int d = a-- && --b;

aは 1 に等しく、評価後にデクリメントされるため ( 1a--に等しい)。つまり、この行は次のようになります。

int d = 1 && --b;

bは 1 だったので、今bは 0 です。また、0 を返すdため、0 にも等しくなります。--b

于 2013-10-26T12:24:16.450 に答える
1

c = a || --b

だから最初a is evaluateda値は1どれですかtrue。したがって、コンパイラは を評価しません--b。だからb価値はまだ1

d = a-- && --b

a-- && --b=> 1 && 0(以来--b = 0)b値が であるため1

どうして1 because a-- is post decrement operator

どうして0 because --b is pre decrement operator

1 && 0 は 0 を返し、この値は d に格納されます

したがって、出力: a = 0, b = 0, c = 1, d = 0

于 2013-10-26T12:37:18.070 に答える