-3
#include <stdio.h>
int main()
{
        int a = 1, b;
        a ? b = 3 : b = 4;
        printf("%d, %d", a, b);
        return 0;
}

[user@localhost programs]$ gcc -Wall vol.c
vol.c: In function ‘main’:
vol.c:5:16: error: lvalue required as left operand of assignment
  a ? b = 3 : b = 4;
                ^

左辺値を指定しましたがb、なぜgccエラーが表示され、どのように修正するのですか?

4

3 に答える 3

8

これは、オペレーターの順序付けに関係しています。コンパイラがあなたがしていると考えているのは

(a ? b = 3 : b) = 4

これは明らかに間違っています。

代わりに、bを左側に置き、次のような条件式を使用して割り当てる値のみを取得してください。

b = a ? 3 : 4;
于 2013-08-19T11:24:13.233 に答える
1

条件演算子 ( ?:) は、ある条件が true または false になることに基づいて常に値を返します。?:つまり、常に r 値を返すと言えます。また、代入式の左側に右辺値を配置することはできません。ステートメント

a ? b = 3 : b = 4;

コンパイラによって次のように解釈されます

(a ? b = 3 : b) = 4;

等分に似ている

3 = 4;

これは間違っています。あなたは私が lvalue を b として与え
たと主張していますが、これは間違っています! 演算子にバインドし、ステートメントによる r 値の評価に参加します b?:

 a ? b = 3 : b;

3したがって、右辺値 ( ) を右辺値 ( ) に代入しています4!
左辺値として使用するbには、次のようにしてこれを行うことができます

b = a ? 3 : 4;

この回答は、演算子のオペランドへのバインディングを理解するのにも役立ちます?:

于 2013-08-19T11:47:56.433 に答える