5

このステートメントでエラーが発生する理由を誰か教えてください - 左辺値が必要です

(a>b?g=a:g=b); 

でもこれは正しい

(a>b?g=a:(g=b));

ここでa , b、 およびgは整数変数であり、aおよびbはキーボードからの入力として取得されます。

4

6 に答える 6

8

表現:

(a>b?g=a:g=b)

次のように解析されます:

(a>b?g=a:g)=b 

また、式に代入できないため、左辺値エラーです。

読む: C と C++ の条件演算子の違いCharles Bailey の回答:

の文法?:は次のとおりです。

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

これは、(「左辺値ではない」規則により) 有効な式を結果として得られないにもかかわらず、a ? b : c = d解析することを意味します。(a ? b : c) = d

補足: _

たとえば、読みやすいように、表現にはスペースを入れてください。

(a>b?g=a:g=b);

次のように記述します。

(a > b? g = a: g = b);

同様に、 と の後にスペースを追加する必要が;あり,ます。

于 2013-07-28T08:06:38.507 に答える
4

問題は演算子の優先順位です。C では、三項条件演算子 ( ?:) が代入演算子 ( ) よりも優先され=ます。

括弧なし (ここでは何もしません) の式は次のようになります。

a > b ? g = a : g = b;

優先順位が最も高い演算子は comparison>であるため、ここで最初の論理グループを取得します。

(a > b) ? g = a : g = b;

次に高い式は 3 項条件式で、次の式になります。

((a > b) ? (g = a) : (g)) = b;

ご覧のとおり、代入演算子の左側に左辺値 (つまり、変数ではなく値) があり、これは機能しません。

すでに気づいたように、これに対する解決策は、式を独自にグループ化することです。特に、優先順位がどのように展開されるかわからない場合は、この良い習慣を検討してください。考えたくない場合は、括弧を追加してください。コードの可読性を念頭に置いてください。可能であれば、演算子の優先順位を自分で解決して、すべてが正しく読みやすいものであることを確認してください。

読みやすさについては、おそらくここでクラシックを使用するif()か、代入演算子を三項条件の外に移動します。これは、通常の定義方法ですmax()

g = a > b ? a : b;

または、マクロまたはインライン関数としてより一般的に:

#define max(a, b) ((a) > (b) ? (a) : (b))

inline int max(int a, int b) {
    return a > b ? a : b;
}
于 2013-07-28T08:19:07.780 に答える