2016-11-02 14 views
4

私はC言語を使い始めました。 if-else文の短い型である演算子。ただし、このコードを実行すると、次のようになります。"エラー:条件演算子の左辺オペランドとして左辺値が必要"

int b; 
int x; 
b=3<2?x=12:x=34; 

「エラー:左辺オペランドが必要です」というエラーが表示されます。なぜそれが起こるのか分かりません。私の考えでは、プログラムはまずxに34を割り当て、次にxに34の値をbに代入します。 一方で、私はエラーなし

int b; 
int x; 
b=3<2?x=12:(x=34); 

としてのステートメントを使用することができます。私は自分の本を見たが、何も助けなかった。なぜ私は最初の声明を使うことができないのですか?私のコンピュータは何をしようとしていますか? おかげで...興味深い質問について

+2

演算子の優先順位おそらく? –

+0

これは三項演算子で、 '?'(some_condition) ':'(other_condition)です。 – t0mm13b

+1

'x'に副作用があり、その値が' b'に代入されている場合は、代入式の*両*のまわりにかっこが必要です。 'b = 3 <2? (x = 12):(x = 34); 'その三項演算子の後に' printf( "%d%d \ n"、b、x);を追加してみてください。 –

答えて

2

1 - それはC++とCの2つの違い

(1)三項式の評価規則は、Cで異なっており、C++

C++のように解析しを強調次の

logical-OR-expression ? expression : assignment-expression 

それ故x=34

assignment-expressionを照合することによって、あなたの文を解析しています
b = 3<2 ? x = 12 : (x = 34); 

しかし、Cはこの

logical-OR-expression ? expression : conditional-expression 

x = 34のように解析するので、あなたの文が

b = (3<2 ? x = 12 : x) = 34; 

のように解析されます(2)C++での条件演算子がCに対し、lvalueを返すことができconditional-expressionではありませんできません。そこで、以下ではC++でなくCで合法である:

CおよびC++コンパイラのためideone.comに検証
b = (3<2 ? x = 12 : x) = 34; 

。左辺値ルールで 差分のためのCおよびC++三項演算子 Conditional operator differences between C and C++間も参照してくださいこれらのリンクdiffのための Errors using ternary operator in c

+0

ideoneは多くのエラーメッセージを抑制するので、 "検証"のための素晴らしいツールではありません。 gcc.godbolt.orgを使って提案する –

関連する問題