次のコードを考えてみましょう:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
次のエラーでコンパイルされます。
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
これは私には公平に聞こえます。後置インクリメントはコードのように解析されて、接頭増分よりも高い優先度を有するint b = ++(i++);
とi
右辺値です。したがってエラー。
デフォルトの優先順位を上書きするために、括弧を付けたこのバリアントについて考えてみましょう。
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
このコードはコンパイルして3を返します。それ自体では、これは公平に聞こえますが、最初のコードとは矛盾しているようです。
質問:なぜ(++i)
あるlvalue
ときi
ではないでしょうか?
ありがとう!
更新:上記のエラーメッセージはgcc(x86-64 9.2)からのものです。これが正確なレンダリングです: gccのエラー
Clang x86-64 9.0.0にはまったく異なるメッセージがあります: clangのエラー
<source>:3:13: error: expression is not assignable
int b = ++i++;
^ ~~~
GCCを使用すると、問題が後置演算子であるという印象を取得し、あなたはその後、ワンダことができる理由++i
OKしばらくはi
、したがって、私の質問ではありません。Clangを使用すると、問題が前置演算子にあることがより明確になります。