(int) + 4*5;
นี่คือเหตุผลที่(การเพิ่มชนิดที่มีค่า)ไปได้หรือไม่ (ลองใช้ g ++ และ gcc.)
ฉันรู้ว่ามันไม่สมเหตุสมผล (และไม่มีผล) แต่ฉันอยากรู้ว่าทำไมถึงเป็นไปได้
(int) + 4*5;
นี่คือเหตุผลที่(การเพิ่มชนิดที่มีค่า)ไปได้หรือไม่ (ลองใช้ g ++ และ gcc.)
ฉันรู้ว่ามันไม่สมเหตุสมผล (และไม่มีผล) แต่ฉันอยากรู้ว่าทำไมถึงเป็นไปได้
cppinsights
ว่าช่วยให้เข้าใจว่าโค้ดมีลักษณะอย่างไรจากมุมมองของคอมไพเลอร์ฟรอนต์เอนด์ นอกจากนี้ยังมีเวอร์ชันออนไลน์คุณสามารถดูว่ามันบอกอะไรเกี่ยวกับตัวอย่างของคุณ ('วงเล็บ' เดียวกันกับคำตอบที่คุณได้รับ)
+(int)+ 4*5;
และ-(int)- 4*5;
และ-+-+-(int)-+-+- 4*5;
น้อยกว่าในเชิงกวี;
คำตอบ:
+
นี่เป็นเอกภาค+
ผู้ประกอบการไม่ดำเนินการนอกจากนี้ไบนารี ไม่มีอะไรเพิ่มเติมเกิดขึ้นที่นี่
นอกจากนี้ไวยากรณ์(int)
ยังใช้สำหรับการพิมพ์
คุณสามารถอ่านคำสั่งนั้นอีกครั้งเป็น
(int) (+ 4) * 5;
ซึ่งแยกวิเคราะห์เป็น
((int) (+ 4)) * (5);
ซึ่งกล่าวว่า
+
4
int
5
สิ่งนี้คล้ายกับ(int) (- 4) * (5);
ที่การใช้งานของตัวดำเนินการยูนารีคุ้นเคยมากกว่า
ในกรณีของคุณ unary +
และ cast to int
- ทั้งคู่ซ้ำซ้อน
(+ 4)
ไม่ได้สร้างตัวถูกดำเนินการ+4
หมายความว่าใช้ยูนารี+
กับตัวถูกดำเนินการ4
ซึ่งแท้จริงแล้วเป็น no-op ในกรณีของ OP แต่อาจทำให้การเลื่อนตำแหน่งจำนวนเต็มหรือการสลายตัวของอาร์เรย์ในสถานการณ์อื่น ๆ ตัวอย่างเช่นchar c = 0; sizeof +c == sizeof c
อาจเป็นเท็จและsizeof +"a"
อาจไม่ใช่ 2
42;
:-)
((int)(+4)) * 5
นี้ถูกตีความว่าเป็น นั่นคือการแสดงออก+4
(ผู้ประกอบการเอกบวกนำไปใช้กับตัวอักษร4
) หล่อพิมพ์int
พร้อมกับโยนแบบ C 5
และผลที่ได้คูณด้วย
(int)-4*5