ลองพิจารณารหัสต่อไปนี้:
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++;
| ^~
มันฟังดูยุติธรรมสำหรับฉัน การเพิ่มขึ้นของ Postfix มีลำดับความสำคัญสูงกว่าการเพิ่มคำนำหน้าดังนั้นจึงมีการแยกวิเคราะห์รหัสint b = ++(i++);
และi
เป็น rvalue ดังนั้นข้อผิดพลาด
ลองพิจารณาตัวแปรนี้ด้วยวงเล็บเพื่อแทนที่ลำดับความสำคัญเริ่มต้น:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
รหัสนี้รวบรวมและส่งคืน 3. ด้วยตัวเองมันฟังดูยุติธรรมสำหรับฉัน แต่มันขัดแย้งกับรหัสแรก
คำถาม: ทำไม(++i)
เป็นlvalue
เมื่อi
ไม่ได้?
ขอบคุณ!
อัปเดต:ข้อความแสดงข้อผิดพลาดที่แสดงด้านบนมาจาก gcc (x86-64 9.2) นี่คือการเรนเดอร์ที่แน่นอน: ข้อผิดพลาดกับ gcc
เสียงดังกราว x86-64 9.0.0 มีข้อความที่แตกต่างกันค่อนข้างมาก: เกิด ข้อผิดพลาดกับเสียงดังกราว
<source>:3:13: error: expression is not assignable
int b = ++i++;
^ ~~~
ด้วย GCC คุณจะได้รับความประทับใจว่าปัญหาเกิดขึ้นกับตัวดำเนินการ postfix และจากนั้นคุณสามารถเดินไปรอบ ๆ ว่าทำไมจึง++i
โอเคในขณะที่i
ไม่เป็นเช่นนั้นคำถามของฉัน ด้วย Clang มันชัดเจนว่าปัญหาเกิดขึ้นกับตัวดำเนินการส่วนหน้า