5

私は次のものを持っています:

int a = 1, b = 2, c = 3, d = 4;
a = b, c = d;
printf("%d, %d, %d, %d", a, b, c, d);

出力は次のとおりです。

2, 2, 4, 4

コンマ演算子は代入演算子とどのように連携しますか?私が知っていることから、次の場合、2番目の式を評価して返します。

(exp1, exp2)

それで、なぜそれは評価するのa = bでしょうか?

4

6 に答える 6

5

最初のオペランドが評価され、結果が破棄されます。次に、2番目のオペランドが評価され、その結果が式の全体的な結果として返されます。

標準は言う:

コンマ演算子の左側のオペランドは、void式として評価されます。その評価と右オペランドの評価の間にはシーケンスポイントがあります。次に、右のオペランドが評価されます。結果にはそのタイプと値があります。

于 2012-12-13T15:38:18.090 に答える
4

コンマ演算子は、割り当てよりも優先順位が低くなります。コンマ演算子のすべての式が評価されますが、結果の値として最後の式のみが使用されます。したがって、両方の割り当てが実行されます。あなたの場合のコンマ演算子の結果は、の結果になりますc = d。この結果は使用されません。

于 2012-12-13T15:38:03.540 に答える
1

コンマ演算子は、両方のオペランド(左側が最初)を評価し、右側のオペランドの値を返します。これは、割り当てであるオペランドに固有のものではありません。

于 2012-12-13T15:38:23.813 に答える
1

これは、単一のステートメントとして記述する場合と同じように機能します。

int a = 1;
int b = 2;
int c = 3;
int d = 4;

a = b;
c = d;

詳細については、コンマ演算子も参照してください。

ウィキペディアから:

int a=1, b=2, c=3, i;   // comma acts as separator in this line, not as an operator
i = (a, b);             // stores b into i                                                              ... a=1, b=2, c=3, i=2
i = a, b;               // stores a into i. Equivalent to (i = a), b;                                   ... a=1, b=2, c=3, i=1
i = (a += 2, a + b);    // increases a by 2, then stores a+b = 3+2 into i                               ... a=3, b=2, c=3, i=5
i = a += 2, a + b;      // increases a by 2, then stores a into i. Equivalent to  (i = a += 2), a + b;  ... a=3, b=2, c=3, i=3
i = a, b, c;            // stores a into i                                                              ... a=5, b=2, c=3, i=5
i = (a, b, c);          // stores c into i  
于 2012-12-13T15:38:42.800 に答える
0

From what I have known it would evaluate and return the second expression

それは完全に正しいステートメントではありません。はい、2番目は評価されて返されますが、最初は無視されることを暗示しています。

コンマ演算子が機能する方法は、すべての式が評価され、最後の式が返されることです。例えば:

int a, b, c, d = 0;
if(a = 1, b = 2, c = 3, d == 1)
    printf("No it isn't!\n")
else
    printf("a: %d, b: %d, c: %d, d: %d\n", a, b, c, d);

あなたにあげる:

a = 1, b = 2, c = 3, d = 0

d==1すべての式が評価されましたが、条件の決定を行うためにのみが返されたためです。

for...この演算子のより良い使用法は、ループ内にある可能性があります。

for(int i = 0; i < x; counter--, i++) // we can keep track of two different counters
                                      // this way going in different directions.
于 2012-12-13T15:46:27.417 に答える
0

このコードは次と同等です。

int a = 1;
int b = 2;
int c = 3;
int d = 4;
a = b;
c = d;

コンマの左側の最初の式が評価され、次に右側の式が評価されます。右端の式の結果は、= 記号の左側の変数に格納されます。

于 2014-02-10T10:45:40.577 に答える