มีเอกสารเฉพาะสำหรับพฤติกรรมของ i=i-- ใน gcc หรือไม่

เป็นอีกครั้งที่ปัญหาแบบ "i=i--" ที่เราชื่นชอบที่สุด ใน C99 เรามี:

6.5 นิพจน์ #2: ระหว่างจุดลำดับก่อนหน้าและถัดไป วัตถุจะต้องมีการแก้ไขค่าที่เก็บไว้ สูงสุดหนึ่งครั้ง

70) ย่อหน้านี้แสดงผล !!ไม่ได้กำหนด!! สำนวนคำสั่ง เช่น

i = ++i + 1;

แต่สำหรับพฤติกรรมที่ไม่ได้ระบุ อาจมีตัวแปรตั้งแต่เอาต์พุตแบบสุ่มไปจนถึง "การทำงานของโปรแกรมในลักษณะที่บันทึกไว้" (c99 3.4.3)

ดังนั้นคำถาม:

gcc บันทึกพฤติกรรม สำหรับ i=i++, i=i-- และอื่นๆ ในคำสั่งหรือไม่

รหัสจริงคือ

int main(){int i=2;i=i--;return i;}

person osgx    schedule 25.08.2010    source แหล่งที่มา
comment
ไม่ gcc ไม่ได้บันทึกสิ่งที่ทำในกรณีนี้ ผู้ดำเนินการ Gcc กำลังมองหาความเร็วของโค้ดที่สร้างขึ้นเหนือสิ่งอื่นใด การบันทึกสิ่งที่ตัวอย่างนี้ทำอาจขัดแย้งกับเป้าหมายนี้ การทำให้โปรแกรมเมอร์ที่เขียนโค้ดตัวอย่างนี้มีความสุขนั้นไม่สำคัญเมื่อเทียบกับการปรับปรุงผลลัพธ์การวัดประสิทธิภาพ   -  person Pascal Cuoq    schedule 25.08.2010


คำตอบ (4)


GCC ไม่ได้บันทึกพฤติกรรมนี้ หน้าตัวเลือกคำเตือน กล่าวถึงปัญหาจุดลำดับใน -Wsequence-point แต่ไม่ บ่งบอกถึงความหมายที่ชัดเจนสำหรับการละเมิด

GCC มีรายการ C ที่ดี พฤติกรรมที่กำหนดการใช้งาน แต่ฉันไม่พบการอ้างอิงถึงปัญหานี้ที่นี่เช่นกัน

person schot    schedule 25.08.2010
comment
ฉันไม่แน่ใจว่าตอนนี้เป็นอย่างไรบ้าง แต่คน GCC ที่ผ่านมาเมื่อใดก็ตามที่เป็นไปได้ถือเป็นมาตรฐานอย่างเปิดเผย IOW หากมาตรฐานระบุว่าไม่ได้กำหนดหรือไม่ระบุ ดังนั้นมาตรฐานจะอยู่ใน GCC - person Dummy00001; 25.08.2010

เหลือเพียงการใช้งานส่วนหลังเพื่อตัดสินใจว่าจะทำอะไร คุณสามารถใช้ -S และตรวจสอบโค้ดที่สร้างขึ้นเพื่อกำหนดลำดับเหตุการณ์ที่แน่นอน

person Ignacio Vazquez-Abrams    schedule 25.08.2010
comment
มีเอกสารเกี่ยวกับกรณีดังกล่าวหรือไม่? - person osgx; 25.08.2010
comment
และแบ็กเอนด์ใน GCC คืออะไร? มันจะแตกต่างกันสำหรับ x86 และ sparc หรือไม่? - person osgx; 25.08.2010
comment
พฤติกรรมที่ไม่ได้กำหนดไว้หมายความว่าทุกสิ่งเป็นเกมที่ยุติธรรม คอมไพเลอร์สามารถเลือกที่จะสร้างโค้ดที่แตกต่างกันในแต่ละวันของสัปดาห์ได้ - person jamesdlin; 25.08.2010
comment
@jamesdlin ใช่ ผู้ควบคุมอาจเริ่มเกมฮานอยใน Emacs ในวันที่ 13 ของเดือน แต่โดยปกติแล้วจะไม่เป็นเช่นนั้น และสำหรับเวอร์ชันและแพลตฟอร์มคอมไพเลอร์แบบคงที่ ผลลัพธ์จะเหมือนกันแม้ในระดับ -O ที่แตกต่างกันก็ตาม - person osgx; 27.08.2010

มันไม่ได้บันทึกไว้แต่ถึงอย่างนั้นฉันก็ไม่อยากอ่านมัน คุณไม่ควรพึ่งพาสิ่งที่การใช้งานเฉพาะทำเมื่อพบพฤติกรรมที่ไม่ได้กำหนดไว้

person mtvec    schedule 25.08.2010
comment
หากจะมีการจัดทำเอกสาร ฉันวางใจได้ว่า GCC ที่มีบางเวอร์ชันจะทำสิ่งนั้น สิ่งที่ได้รับการบันทึกไว้ ใช่ รหัสของฉันจะผิดพลาดสำหรับคอมไพเลอร์อื่น แต่ไม่ใช่สำหรับ GCC - person osgx; 25.08.2010
comment
@osgx: บางทีคุณอาจทำได้ แต่ฉันคิดว่ามันจะสร้างปัญหามากกว่าที่ควรจะเป็น ตัวอย่างเช่น เป็นเรื่องที่น่าสับสนมากสำหรับผู้ที่อ่านโค้ดของคุณ แล้วทำไมคุณถึงอยากทำบางอย่างแบบ i = i-- ล่ะ? คุณควรรู้ว่าคุณต้องการให้มันทำอะไร ทำไมไม่สะกดเป็นภาษา C++ ที่เหมาะสมล่ะ? - person mtvec; 25.08.2010
comment
กรณีนี้มาถึงเราจากชุดทดสอบขนาดใหญ่ของเรา ซึ่งบางส่วนเขียนโดยผู้ทดสอบของเรา พวกเขามีทักษะภาษา C ในระดับที่แตกต่างกันมาก - person osgx; 25.08.2010
comment
@osgx: น่ากลัว ฉันจะบังคับให้พวกเขาคอมไพล์ด้วย -Wall เสมอ ซึ่งเป็นความคิดที่ดี แต่อย่างใด สิ่งนี้จะเปิดใช้งาน -Wsequence-point ที่กล่าวถึงโดยเฉพาะ - person Jens Gustedt; 25.08.2010
comment
@osgx ตอนนี้ฉันเข้าใจบริบทดีขึ้นเล็กน้อยแล้ว ฉันคิดว่าฉันสามารถพูดถึงเครื่องวิเคราะห์แบบคงที่ที่คนอื่นและฉันทำงานอยู่ได้ (ดูประวัติของฉัน) จะพบพฤติกรรมที่ไม่ได้กำหนดหรือไม่ระบุจำนวนมากหากโค้ดที่วิเคราะห์อยู่ในชุดย่อย C ที่ถูกต้อง ในทางกลับกัน มีสถานที่ใดที่มีข้อมูลเพิ่มเติมเกี่ยวกับงานที่มีคำถามนี้เกิดขึ้นกับคุณหรือไม่ - person Pascal Cuoq; 25.08.2010
comment
@Pascal Cuoq ชุดทดสอบนี้เป็นแบบส่วนตัวและอยู่ภายใต้ nda gcc ตรวจพบ i=i-- ค่อนข้างดี และฉันมักจะใช้ตัวเลือก -W -Wall -Wextra -pedantic -ansi สำหรับ gcc นอกจากนี้ .. ดูเหมือนว่าการทดสอบดั้งเดิมนั้นขึ้นอยู่กับข้อมูลตามผลลัพธ์ของ i=i-- นี้ แต่ในขณะเดียวกันจะประสบความสำเร็จในความเข้าใจเล็กน้อยของโครงสร้างนี้ - person osgx; 25.08.2010

ทำไมบนโลกนี้คุณถึงอยากทำแบบนั้น? อย่างจริงจัง. ฉันอยากรู้.

person Dave Dopson    schedule 25.08.2010
comment
รหัสนี้พบได้ในชุดทดสอบคอมไพเลอร์ ชุดทดสอบนี้ใช้ได้กับ gcc บาง เวอร์ชัน - person osgx; 25.08.2010
comment
มันเป็นพฤติกรรมที่ไม่ได้กำหนดไว้ ดังนั้นพฤติกรรมใดๆ ก็ตามก็ถูกต้อง หากการทดสอบคอมไพเลอร์ของคุณส่งคืน ไม่ถูกต้อง สำหรับคอมไพเลอร์ใด ๆ แสดงว่าการทดสอบของคุณเสียหาย เนื่องจากควรส่งคืน ถูกต้อง เสมอ ไม่ว่าผลลัพธ์จะเป็น 2, 3, 4 หรือ จุดสิ้นสุดของจักรวาลอย่างที่เรารู้ เราสามารถเลือกได้หากพฤติกรรมที่ไม่ได้กำหนดนั้นมีผลลัพธ์ที่ถูกต้องเสมอหรือไม่ถูกต้องเสมอไป ;) - person Secure; 25.08.2010
comment
BTW คุณได้ทดสอบแล้วว่าผลลัพธ์มีความสอดคล้องกันในระดับการปรับให้เหมาะสมที่แตกต่างกันหรือไม่? - person Secure; 25.08.2010
comment
@Secure การทดสอบจริงประสบความสำเร็จสำหรับทั้งสองกรณีของ i=i-- การทำงาน มันจะนับการทำซ้ำที่แตกต่างกัน แต่จะสำเร็จ เป็นการทดสอบคอมไพเลอร์ ไม่ใช่เพื่อการปฏิบัติตามมาตรฐาน ในเวอร์ชัน gcc ที่ทดสอบ ผลลัพธ์จะเหมือนกันสำหรับระดับ -O ที่ทดสอบทั้งหมด - person osgx; 27.08.2010