Hãy xem xét các mã sau đây:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
Nó biên dịch với lỗi sau:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
Điều này nghe có vẻ công bằng với tôi. Gia tăng tiền tố có mức độ ưu tiên cao hơn mức tăng tiền tố, do đó mã được phân tích cú pháp dưới dạng int b = ++(i++);
và i
là một giá trị. Do đó có lỗi.
Bây giờ chúng ta hãy xem xét biến thể này với dấu ngoặc đơn để ghi đè các ưu tiên mặc định:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
Mã này biên dịch và trả về 3. Bản thân nó, điều này nghe có vẻ công bằng với tôi nhưng có vẻ mâu thuẫn với mã đầu tiên.
Câu hỏi: tại sao (++i)
là lvalue
khi i
không?
Cảm ơn!
CẬP NHẬT: thông báo lỗi hiển thị ở trên là từ gcc (x86-64 9.2). Đây là kết xuất chính xác: lỗi với gcc
Clang x86-64 9.0.0 có một thông báo khá khác: lỗi với tiếng kêu
<source>:3:13: error: expression is not assignable
int b = ++i++;
^ ~~~
Với GCC, bạn có ấn tượng rằng vấn đề xảy ra với toán tử postfix và sau đó bạn có thể đi lang thang tại sao ++i
vẫn ổn trong khi i
không, vì vậy câu hỏi của tôi. Với Clang, rõ ràng hơn là vấn đề với toán tử tiền tố.