มันไม่ได้กำหนดเพราะมันจะแก้ไขxสองครั้งระหว่างจุดลำดับ มาตรฐานบอกว่ามันไม่ได้กำหนดดังนั้นมันจึงไม่ได้กำหนด
เท่าที่ฉันรู้
แต่ทำไม
ความเข้าใจของฉันคือการห้ามการทำเช่นนี้จะช่วยให้คอมไพเลอร์เพิ่มประสิทธิภาพได้ดีขึ้น นี่อาจสมเหตุสมผลเมื่อ C ถูกประดิษฐ์ขึ้น แต่ตอนนี้ดูเหมือนจะเป็นข้อโต้แย้งที่อ่อนแอ
ถ้าเราต้องสร้าง C ใหม่วันนี้เราจะทำแบบนี้หรือจะทำได้ดีกว่านี้ได้ไหม
หรืออาจมีปัญหาที่ลึกกว่านั้นทำให้ยากที่จะกำหนดกฎที่สอดคล้องกันสำหรับนิพจน์ดังกล่าวดังนั้นจึงเป็นการดีที่สุดที่จะห้ามพวกเขา
สมมติว่าเราต้องสร้าง C ใหม่ในวันนี้ ฉันอยากจะแนะนำกฎง่ายๆสำหรับการแสดงออกเช่นx=x++ซึ่งดูเหมือนว่าฉันจะทำงานได้ดีกว่ากฎที่มีอยู่
ฉันต้องการรับความคิดเห็นของคุณเกี่ยวกับกฎที่แนะนำเมื่อเปรียบเทียบกับกฎที่มีอยู่หรือคำแนะนำอื่น ๆ
กฎที่แนะนำ:
- ระหว่างจุดลำดับลำดับของการประเมินผลจะไม่ได้รับการกำหนด
- ผลข้างเคียงเกิดขึ้นทันที
ไม่มีพฤติกรรมที่ไม่ได้กำหนดที่เกี่ยวข้อง นิพจน์ประเมินค่านี้หรือว่า แต่จะไม่ฟอร์แมตฮาร์ดดิสก์ของคุณอย่างแน่นอน (ฉันไม่เคยเห็นการใช้งานที่x=x++ฟอร์แมตฮาร์ดดิสก์มาก่อน)
ตัวอย่างนิพจน์
x=x++-xดีที่กำหนดไว้ไม่เปลี่ยนแปลง
ครั้งแรกที่xจะเพิ่มขึ้น (ทันทีเมื่อx++ได้รับการประเมิน)xแล้วก็ค่าเดิมจะถูกเก็บไว้ในx++ + ++x- ที่เพิ่มสองครั้งเพื่อประเมินxแม้ว่าอาจประเมินทั้งสองด้านก่อนผลลัพธ์ก็คือ(ด้านซ้ายก่อน) หรือ(ด้านขวาก่อน)2*x+2x + (x+2)(x+1) + (x+1)x = x + (x=3)- ไม่ได้,xการตั้งค่าเป็นอย่างใดอย่างหนึ่งหรือx+3ถ้าด้านขวาได้รับการประเมินครั้งแรกก็ นอกจากนี้ยังเป็นไปได้ว่ามีการประเมินครั้งแรกจึงเป็น ในกรณีใดกรณีหนึ่งการมอบหมายจะเกิดขึ้นทันทีเมื่อประเมินผลดังนั้นค่าที่เก็บไว้จะถูกเขียนทับโดยการมอบหมายอื่น ๆ6x+3x=33+3x=3x=3x+=(x=3)- กำหนดไว้อย่างดีตั้งค่าxเป็น 6
คุณสามารถยืนยันว่านี่เป็นเพียงการจดชวเลขสำหรับการแสดงออกข้างต้น
แต่ฉันบอกว่า+=จะต้องดำเนินการหลังจากx=3และไม่ได้อยู่ในสองส่วน (อ่านxประเมินx=3เพิ่มและเก็บค่าใหม่)
ข้อดีคืออะไร
ความคิดเห็นบางอย่างยกประเด็นที่ดีนี้
ฉันไม่คิดว่านิพจน์เช่นx=x++ควรใช้ในรหัสปกติ
ที่จริงแล้วฉันเข้มงวดกว่านั้นมาก - ฉันคิดว่าการใช้งานที่ดีเพียงอย่างเดียวสำหรับx++ในx++;คนเดียว
อย่างไรก็ตามฉันคิดว่ากฎของภาษาต้องเรียบง่ายที่สุดเท่าที่จะเป็นไปได้ มิฉะนั้นโปรแกรมเมอร์ก็ไม่เข้าใจ กฎห้ามเปลี่ยนตัวแปรสองครั้งระหว่างจุดลำดับแน่นอนว่าโปรแกรมเมอร์ส่วนใหญ่ไม่เข้าใจ
กฎพื้นฐานมาก ๆ คือ:
ถ้า A ถูกต้องและ B นั้นถูกต้องและรวมเข้าด้วยกันอย่างถูกต้องผลลัพธ์จะใช้ได้
xเป็นค่า L ที่ถูกต้องx++เป็นนิพจน์ที่ถูกต้องและ=เป็นวิธีที่ถูกต้องในการรวมค่า L และนิพจน์ดังนั้นทำไมx=x++จึงไม่ถูกกฎหมาย
มาตรฐาน C สร้างข้อยกเว้นที่นี่และข้อยกเว้นนี้ทำให้กฎมีความซับซ้อน คุณสามารถค้นหาstackoverflow.comและดูว่าข้อยกเว้นนี้ทำให้ผู้คนสับสนมากแค่ไหน
ดังนั้นฉันพูด - กำจัดความสับสนนี้
=== สรุปคำตอบ ===
ทำไมทำอย่างนั้น?
ฉันพยายามอธิบายในหัวข้อข้างต้น - ฉันต้องการให้กฎ C เป็นเรื่องง่ายศักยภาพในการปรับให้เหมาะสม:
สิ่งนี้ใช้เสรีภาพบางส่วนจากคอมไพเลอร์ แต่ฉันไม่เห็นสิ่งใดที่ทำให้ฉันมั่นใจว่าอาจมีความสำคัญ
การปรับให้เหมาะสมส่วนใหญ่ยังคงสามารถทำได้ ตัวอย่างเช่นa=3;b=5;สามารถจัดลำดับใหม่แม้ว่ามาตรฐานจะระบุคำสั่งซื้อก็ตาม นิพจน์เช่นa=b[i++]ยังสามารถปรับให้เหมาะสมในทำนองเดียวกันคุณไม่สามารถเปลี่ยนมาตรฐานที่มีอยู่
ฉันยอมรับฉันทำไม่ได้ ฉันไม่เคยคิดว่าฉันจะสามารถไปข้างหน้าและเปลี่ยนมาตรฐานและคอมไพเลอร์ได้ ฉันแค่อยากจะคิดว่าถ้าสิ่งต่าง ๆ สามารถทำได้แตกต่างกัน
xให้ตัวเองมีไม่มากนักและหากคุณต้องการเพิ่มxคุณสามารถพูดได้ว่าx++;- ไม่จำเป็นต้องมอบหมาย ฉันว่ามันไม่ควรนิยามเพราะมันยากที่จะจำสิ่งที่ควรจะเกิดขึ้น