เหตุใด C และ C ++ จึงอนุญาตให้ใช้นิพจน์ (int) + 4 * 5


87
(int) + 4*5;

นี่คือเหตุผลที่(การเพิ่มชนิดที่มีค่า)ไปได้หรือไม่ (ลองใช้ g ++ และ gcc.)

ฉันรู้ว่ามันไม่สมเหตุสมผล (และไม่มีผล) แต่ฉันอยากรู้ว่าทำไมถึงเป็นไปได้


19
เช่นเดียวกับ(int)-4*5
P__J สนับสนุนผู้หญิงในโปแลนด์

45
มีเครื่องมือที่มีประโยชน์ที่เรียกcppinsightsว่าช่วยให้เข้าใจว่าโค้ดมีลักษณะอย่างไรจากมุมมองของคอมไพเลอร์ฟรอนต์เอนด์ นอกจากนี้ยังมีเวอร์ชันออนไลน์คุณสามารถดูว่ามันบอกอะไรเกี่ยวกับตัวอย่างของคุณ ('วงเล็บ' เดียวกันกับคำตอบที่คุณได้รับ)
Nikita Kniazev

22
คำพูดนี้เทียบเท่ากับ+(int)+ 4*5;และ-(int)- 4*5;และ-+-+-(int)-+-+- 4*5;น้อยกว่าในเชิงกวี;
chqrlie

16
คุณไขปริศนาอะไร สำหรับสิ่งที่ฉันรู้คุณกำลังถามว่าทำไมคุณจึงได้รับอนุญาตให้เขียน 5 โดยไม่ต้องระบุเครื่องหมาย
Carsten S

5
C ++ ไม่ควรเตือนคุณว่าไม่แนะนำให้ใช้ C-type casts ใน C ++?
Mr Lister

คำตอบ:


141

+นี่เป็นเอกภาค+ผู้ประกอบการไม่ดำเนินการนอกจากนี้ไบนารี ไม่มีอะไรเพิ่มเติมเกิดขึ้นที่นี่

นอกจากนี้ไวยากรณ์(int)ยังใช้สำหรับการพิมพ์

คุณสามารถอ่านคำสั่งนั้นอีกครั้งเป็น

(int) (+ 4) * 5;    

ซึ่งแยกวิเคราะห์เป็น

((int) (+ 4)) * (5);    

ซึ่งกล่าวว่า

  1. สมัครเอกประกอบกับค่าคงที่จำนวนเต็ม+4
  2. พิมพ์เป็นไฟล์ int
  3. คูณด้วยตัวถูกดำเนินการ 5

สิ่งนี้คล้ายกับ(int) (- 4) * (5);ที่การใช้งานของตัวดำเนินการยูนารีคุ้นเคยมากกว่า

ในกรณีของคุณ unary +และ cast to int- ทั้งคู่ซ้ำซ้อน


50
"แคสต์" ไม่ใช่ "การแคสติ้ง" การพิมพ์ดีดเป็นสิ่งที่เกิดขึ้นกับนักแสดง
Keith Thompson

8
(+ 4)ไม่ได้สร้างตัวถูกดำเนินการ+4หมายความว่าใช้ยูนารี+กับตัวถูกดำเนินการ4ซึ่งแท้จริงแล้วเป็น no-op ในกรณีของ OP แต่อาจทำให้การเลื่อนตำแหน่งจำนวนเต็มหรือการสลายตัวของอาร์เรย์ในสถานการณ์อื่น ๆ ตัวอย่างเช่นchar c = 0; sizeof +c == sizeof cอาจเป็นเท็จและsizeof +"a"อาจไม่ใช่ 2
chqrlie

7
"ทั้งสองมีความซ้ำซ้อน" - สิ่งที่ทั้งซ้ำซ้อนเช่นเดียว42;:-)
paxdiablo

11
ฉันไม่เห็นอะไรผิดปกติกับการใช้คำว่า Type Casting ดูเหมือนว่าฉันไม่ได้เป็นเพียงคนเดียว
เบ็น

14
@ Ben Typecasting ไม่ใช่พิมพ์หล่อ
Kenneth K.

40

((int)(+4)) * 5นี้ถูกตีความว่าเป็น นั่นคือการแสดงออก+4(ผู้ประกอบการเอกบวกนำไปใช้กับตัวอักษร4) หล่อพิมพ์intพร้อมกับโยนแบบ C 5และผลที่ได้คูณด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.