คำตอบเดียวสำหรับคำถามของคุณที่ถูกต้องคือ: เพราะมันไม่ได้กำหนด
ตกลงก่อนที่คุณจะเผาฉันทั้งหมด ..
คุณทุกคนตอบว่าทำไมi+=i++
เป็น ok i=0
และตรรกะที่จะส่งผลในการ
ฉันถูกล่อลวงให้ลงคะแนนแต่ละคำตอบของคุณทุกคน แต่ชื่อเสียงที่ฉันคำนวณมานั้นสูงเกินไป ..
ทำไมฉันถึงคลั่งไคล้คุณ ไม่ใช่เพราะสิ่งที่คำตอบของคุณอธิบาย ..
ฉันหมายถึงทุกคำตอบที่ฉันอ่านได้พยายามอย่างยอดเยี่ยมในการอธิบายสิ่งที่เป็นไปไม่ได้ฉันปรบมือ!
แต่ผลลัพธ์คืออะไร ?? มันเป็นผลที่ใช้งานง่าย - มันเป็นผลที่ยอมรับได้หรือไม่?
คุณแต่ละคนเห็นว่า "ราชาที่เปลือยเปล่า" และยอมรับว่าเป็นกษัตริย์ที่มีเหตุผล
คุณผิดทั้งหมด!
i+=i++;
ส่งผลให้ใน0
ไม่ได้กำหนด
ข้อผิดพลาดในกลไกการประเมินผลภาษาถ้าคุณจะ .. หรือแย่กว่านั้น! ข้อบกพร่องในการออกแบบ
ต้องการพิสูจน์ไหม แน่นอนคุณต้องการ!
int t=0; int i=0; t+=i++; //t=0; i=1
ตอนนี้ ... เป็นผลลัพธ์ที่เข้าใจง่าย! เพราะเราประเมินครั้งแรกt
มอบหมายให้มันด้วยค่าและหลังจากการประเมินและการมอบหมายเรามีการดำเนินการโพสต์แล้ว - เหตุผลไม่ใช่หรือ
มันมีเหตุผลว่า: i=i++
และi=i
ให้ผลลัพธ์เดียวกันi
หรือไม่
ในขณะที่t=i++
และมีผลที่แตกต่างกันสำหรับt=i
i
การดำเนินการภายหลังเป็นสิ่งที่ควรเกิดขึ้นหลังจากการประเมินผลข้อความ
ดังนั้น:
int i=0;
i+=i++;
ควรเหมือนกันถ้าเราเขียนว่า:
int i=0;
i = i + i ++;
และเช่นเดียวกับ:
int i=0;
i= i + i;
i ++;
และเช่นเดียวกับ:
int i=0;
i = i + i;
i = i + 1;
ผลลัพธ์ใด ๆ ที่ไม่ได้1
บ่งบอกถึงข้อบกพร่องในการเขียนหรือข้อบกพร่องในการออกแบบภาษาถ้าเราไปด้วยการคิดอย่างมีเหตุผล - อย่างไรก็ตาม MSDN และแหล่งข้อมูลอื่น ๆ บอกเราว่า "เฮ้ - นี่คือไม่ได้กำหนด!"
ตอนนี้ก่อนที่ฉันจะดำเนินการต่อไปแม้ตัวอย่างชุดนี้ฉันไม่ได้รับการสนับสนุนหรือเป็นที่ยอมรับจากใครก็ตาม .. อย่างไรก็ตามนี่คือสิ่งที่เป็นไปตามสัญชาตญาณและเหตุผลที่ควรได้รับผล
ผู้เขียนโค้ดไม่ควรมีความรู้ในการเขียนหรือแปลชุดประกอบ!
หากมีการเขียนในลักษณะที่จะไม่เคารพคำจำกัดความภาษา - มันเป็นข้อผิดพลาด!
และจะเสร็จสิ้นผมคัดลอกจากวิกิพีเดียเพิ่มและผู้ประกอบการลดลง :
ตั้งแต่ปรับเปลี่ยนเพิ่มขึ้น / ลดลงผู้ประกอบการถูกดำเนินการของการใช้ดังกล่าวถูกดำเนินการมากกว่าหนึ่งครั้งภายในแสดงออกเดียวกันสามารถให้ผลลัพธ์ที่ไม่ได้กำหนด ตัวอย่างเช่นในนิพจน์เช่น x - ++ x จะไม่ชัดเจนในลำดับที่ควรดำเนินการตัวดำเนินการลบและส่วนเพิ่ม สถานการณ์เช่นนี้จะยิ่งแย่ลงเมื่อคอมไพเลอร์ถูกปรับให้เหมาะสมซึ่งอาจส่งผลให้ลำดับการดำเนินการของการดำเนินการแตกต่างจากที่โปรแกรมเมอร์ตั้งใจไว้
และดังนั้นจึง.
คำตอบที่ถูกต้องคือไม่ควรใช้สิ่งนี้! (ตามที่ไม่ได้ระบุไว้!)
ใช่ .. - มันมีผลลัพธ์ที่คาดเดาไม่ได้แม้ว่า C # พยายามที่จะทำให้เป็นมาตรฐาน
ฉันไม่พบเอกสารของ C # ที่อธิบายพฤติกรรมของคุณทุกคนซึ่งบันทึกไว้ว่าเป็นพฤติกรรมปกติหรือที่กำหนดไว้อย่างดีของภาษา สิ่งที่ฉันพบคือสิ่งที่ตรงกันข้ามแน่นอน!
[ คัดลอกมาจากเอกสาร MSDN สำหรับ Postfix Increment and Decrement Operators: ++ และ - ]
เมื่อผู้ประกอบการ postfix ถูกนำไปใช้กับฟังก์ชั่นการโต้แย้งค่าของการโต้แย้งไม่รับประกันว่าจะเพิ่มขึ้นหรือลดลงก่อนที่มันจะถูกส่งผ่านไปยังฟังก์ชั่น ดูส่วน 1.9.17 ในมาตรฐาน C ++ สำหรับข้อมูลเพิ่มเติม
สังเกตคำที่ไม่รับประกัน ...
ยกโทษให้ฉันถ้าคำตอบที่ดูเหมือนหยิ่ง - ฉันไม่ใช่คนหยิ่ง ฉันแค่พิจารณาว่าผู้คนหลายพันคนมาที่นี่เพื่อเรียนรู้และคำตอบที่ฉันอ่านจะทำให้พวกเขาเข้าใจผิดและจะเป็นอันตรายต่อตรรกะและความเข้าใจในเรื่องของพวกเขา