อย่าเขียนโค้ดแบบนั้น
สำหรับj<1000
, j/1000
คือศูนย์ (การหารจำนวนเต็ม) ดังนั้น:
(&main + (&exit - &main)*(j/1000))(j+1);
เทียบเท่ากับ:
(&main + (&exit - &main)*0)(j+1);
ซึ่งเป็น:
(&main)(j+1);
ซึ่งเรียกร้องกับmain
j+1
ถ้าj == 1000
เช่นนั้นบรรทัดเดียวกันจะออกมาเป็น:
(&main + (&exit - &main)*1)(j+1);
ซึ่งเดือดลงไป
(&exit)(j+1);
ซึ่งเป็นexit(j+1)
และออกจากโปรแกรม
(&exit)(j+1)
และexit(j+1)
มันก็เป็นสิ่งเดียวกัน - การอ้างอิง C99 §6.3.2.1 / 4:
ตัวออกแบบฟังก์ชั่นคือการแสดงออกที่มีประเภทฟังก์ชั่น ยกเว้นเมื่อเป็นตัวถูกดำเนินการของตัวดำเนินการ sizeof หรือ unary & operator ตัวออกแบบฟังก์ชั่นที่มีประเภท " function return type " จะถูกแปลงเป็นนิพจน์ที่มีประเภท " pointer to function return type "
exit
เป็นตัวกำหนดฟังก์ชั่น แม้ว่าจะไม่มี&
โอเปอเรเตอร์แอดเดรสของผู้ใช้ แต่ก็ถือว่าเป็นตัวชี้ไปยังฟังก์ชัน ( &
เพียงแค่ทำให้ชัดเจน)
และฟังก์ชั่นการโทรอธิบายไว้ใน§6.5.2.2 / 1 และต่อไปนี้:
การแสดงออกที่หมายถึงฟังก์ชั่นที่เรียกว่าจะต้องมีตัวชี้ประเภทเพื่อฟังก์ชั่นการส่งกลับเป็นโมฆะหรือกลับประเภทวัตถุอื่นที่ไม่ใช่ประเภทอาร์เรย์
ดังนั้นexit(j+1)
ทำงานเนื่องจากการแปลงโดยอัตโนมัติของประเภทฟังก์ชั่นเป็นประเภทตัวชี้ไปยังฟังก์ชั่นและ(&exit)(j+1)
ทำงานได้ดีกับการแปลงที่ชัดเจนเป็นประเภทตัวชี้ไปยังฟังก์ชั่น
ที่ถูกกล่าวว่ารหัสข้างต้นไม่สอดคล้อง ( main
ใช้เวลาสองข้อโต้แย้งหรือไม่มีเลย) และ&exit - &main
ฉันเชื่อว่าไม่ได้กำหนดตาม§6.5.6 / 9:
เมื่อพอยน์เตอร์สองตัวถูกลบทั้งคู่จะชี้ไปที่องค์ประกอบของวัตถุอาร์เรย์เดียวกันหรือผ่านองค์ประกอบสุดท้ายของวัตถุอาร์เรย์ ...
การเพิ่ม(&main + ...)
จะถูกต้องในตัวเองและสามารถใช้ถ้าปริมาณเพิ่มเป็นศูนย์เนื่องจาก§6.5.6 / 7 พูดว่า:
สำหรับวัตถุประสงค์ของตัวดำเนินการเหล่านี้ตัวชี้ไปยังวัตถุที่ไม่ใช่องค์ประกอบของอาร์เรย์จะทำงานเหมือนกับตัวชี้ไปยังองค์ประกอบแรกของอาร์เรย์ที่มีความยาวหนึ่งชนิดของวัตถุเป็นชนิดองค์ประกอบ
ดังนั้นการเพิ่มศูนย์ให้&main
จะโอเค (แต่ไม่ค่อยมีประโยชน์)
main
ใน C ++