このステートメントでエラーが発生する理由を誰か教えてください - 左辺値が必要です
(a>b?g=a:g=b);
でもこれは正しい
(a>b?g=a:(g=b));
ここでa , b
、 およびg
は整数変数であり、a
およびb
はキーボードからの入力として取得されます。
このステートメントでエラーが発生する理由を誰か教えてください - 左辺値が必要です
(a>b?g=a:g=b);
でもこれは正しい
(a>b?g=a:(g=b));
ここでa , b
、 およびg
は整数変数であり、a
およびb
はキーボードからの入力として取得されます。
表現:
(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);
同様に、 と の後にスペースを追加する必要が;
あり,
ます。
問題は演算子の優先順位です。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;
}