มันไม่ได้กำหนดเพราะมันจะแก้ไขx
สองครั้งระหว่างจุดลำดับ มาตรฐานบอกว่ามันไม่ได้กำหนดดังนั้นมันจึงไม่ได้กำหนด
เท่าที่ฉันรู้
แต่ทำไม
ความเข้าใจของฉันคือการห้ามการทำเช่นนี้จะช่วยให้คอมไพเลอร์เพิ่มประสิทธิภาพได้ดีขึ้น นี่อาจสมเหตุสมผลเมื่อ C ถูกประดิษฐ์ขึ้น แต่ตอนนี้ดูเหมือนจะเป็นข้อโต้แย้งที่อ่อนแอ
ถ้าเราต้องสร้าง C ใหม่วันนี้เราจะทำแบบนี้หรือจะทำได้ดีกว่านี้ได้ไหม
หรืออาจมีปัญหาที่ลึกกว่านั้นทำให้ยากที่จะกำหนดกฎที่สอดคล้องกันสำหรับนิพจน์ดังกล่าวดังนั้นจึงเป็นการดีที่สุดที่จะห้ามพวกเขา
สมมติว่าเราต้องสร้าง C ใหม่ในวันนี้ ฉันอยากจะแนะนำกฎง่ายๆสำหรับการแสดงออกเช่นx=x++
ซึ่งดูเหมือนว่าฉันจะทำงานได้ดีกว่ากฎที่มีอยู่
ฉันต้องการรับความคิดเห็นของคุณเกี่ยวกับกฎที่แนะนำเมื่อเปรียบเทียบกับกฎที่มีอยู่หรือคำแนะนำอื่น ๆ
กฎที่แนะนำ:
- ระหว่างจุดลำดับลำดับของการประเมินผลจะไม่ได้รับการกำหนด
- ผลข้างเคียงเกิดขึ้นทันที
ไม่มีพฤติกรรมที่ไม่ได้กำหนดที่เกี่ยวข้อง นิพจน์ประเมินค่านี้หรือว่า แต่จะไม่ฟอร์แมตฮาร์ดดิสก์ของคุณอย่างแน่นอน (ฉันไม่เคยเห็นการใช้งานที่x=x++
ฟอร์แมตฮาร์ดดิสก์มาก่อน)
ตัวอย่างนิพจน์
x=x++
-x
ดีที่กำหนดไว้ไม่เปลี่ยนแปลง
ครั้งแรกที่x
จะเพิ่มขึ้น (ทันทีเมื่อx++
ได้รับการประเมิน)x
แล้วก็ค่าเดิมจะถูกเก็บไว้ในx++ + ++x
- ที่เพิ่มสองครั้งเพื่อประเมินx
แม้ว่าอาจประเมินทั้งสองด้านก่อนผลลัพธ์ก็คือ(ด้านซ้ายก่อน) หรือ(ด้านขวาก่อน)2*x+2
x + (x+2)
(x+1) + (x+1)
x = x + (x=3)
- ไม่ได้,x
การตั้งค่าเป็นอย่างใดอย่างหนึ่งหรือx+3
ถ้าด้านขวาได้รับการประเมินครั้งแรกก็ นอกจากนี้ยังเป็นไปได้ว่ามีการประเมินครั้งแรกจึงเป็น ในกรณีใดกรณีหนึ่งการมอบหมายจะเกิดขึ้นทันทีเมื่อประเมินผลดังนั้นค่าที่เก็บไว้จะถูกเขียนทับโดยการมอบหมายอื่น ๆ6
x+3
x=3
3+3
x=3
x=3
x+=(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++;
- ไม่จำเป็นต้องมอบหมาย ฉันว่ามันไม่ควรนิยามเพราะมันยากที่จะจำสิ่งที่ควรจะเกิดขึ้น