ตัวดำเนินการ C++ std::cout และ ‹‹ ลำดับความสำคัญ [ซ้ำกัน]

ฉันมีรหัสเช่นนี้:

std::cout << " a: " << classDate.getDays() << " b: " << classDate++ << " c: " << classDate.getDays();

ฉันโอเวอร์โหลดตัวดำเนินการหลังการเพิ่ม

ในคลาส m_days ตัวแปรมีค่า:

  • ก่อนตัวดำเนินการ ++ - 4
  • หลังจาก ++ โอเปอเรเตอร์ -5

คำถามของฉันคือ ทำไมผลลัพธ์จาก cout ถึงผิดลำดับ:

a: 5 b: 5 c: 4

ฉันตรวจสอบมันในดีบักเกอร์ ค่าในคลาสถูกต้อง เมื่อฉันเขียนโค้ดดังนี้:

std::cout << " a: " << classDate.getDays();
std::cout << " b: " << classDate++;
std::cout << " c: " << classDate.getDays();

ทุกอย่างถูกต้อง (a: 4 b: 5 c: 5)

เป็นปัญหาลำดับความสำคัญของผู้ปฏิบัติงานหรือไม่

คามิล


person e2p    schedule 09.12.2013    source แหล่งที่มา
comment
ฉันไม่แน่ใจว่าคุณจะได้รับ b: 5 ได้อย่างไรเมื่อคุณใช้ส่วนเพิ่มภายหลัง นี่เป็นรหัสที่คุณใช้ใช่ไหม   -  person David Brown    schedule 10.12.2013
comment
ฉันขอโทษ ฉันลืมไป หลังการเพิ่มส่งกลับค่าใหม่เป็นจำนวนเต็ม   -  person e2p    schedule 10.12.2013
comment
@kolumb จากนั้นคุณได้ใช้คำนำหน้า ++ และเรียกมันว่า postfix ผู้ดูแลโค้ดในอนาคตจะพบว่าสิ่งนี้ยากที่จะเข้าใจอย่างน้อยที่สุด   -  person Mark B    schedule 10.12.2013


คำตอบ (3)


ไม่ได้ระบุลำดับการประเมิน

ดู คำตอบ ซึ่งเป็นคำอธิบายที่ดีเกี่ยวกับเรื่องนี้ ประเภทของผลลัพธ์

person Marcassin    schedule 09.12.2013

ในภาษา C++ ลำดับการประเมินอาร์กิวเมนต์ของฟังก์ชัน (และ operator<< ที่โอเวอร์โหลดที่ใช้ที่นี่เป็นเพียงฟังก์ชัน) ไม่ได้ถูกกำหนดไว้ ดังนั้นคอมไพเลอร์จึงมีอิสระในการประเมิน classDate++ รวมถึง classDate.getDays() แต่ละตัวในลำดับใดก็ได้ที่เลือก ดังนั้นด้วยคอมไพเลอร์ที่แตกต่างกันหรือตัวเลือกการคอมไพล์ที่แตกต่างกัน คุณก็จะได้รับสิ่งใดสิ่งหนึ่ง

a: 4 b: 5 c: 4
a: 4 b: 5 c: 5
a: 5 b: 5 c: 4
a: 5 b: 5 c: 5

หากคุณต้องการให้ประเมินตามลำดับที่เฉพาะเจาะจง คุณควรใส่ผลลัพธ์ไว้ในคำสั่ง septate ดังตัวอย่างที่สองของคุณ

person David Brown    schedule 09.12.2013

ฉันเดาว่าตัวดำเนินการ ++ ทำให้เกิดผลข้างเคียงที่รับประกันว่าจะเกิดขึ้นหลังจากจุดลำดับ (ดู http://en.wikipedia.org/wiki/Sequence_point และ พฤติกรรมที่ไม่ได้กำหนด และจุดลำดับ)

จนถึงจุดต่อเนื่องนั้นจะขึ้นอยู่กับคอมไพเลอร์เมื่อนิพจน์ได้รับการประเมิน ดังนั้นคุณจึงไม่สามารถพึ่งพาลำดับการประเมินของนิพจน์ของคุณได้

ในตัวอย่างที่สองของคุณ มีจุดลำดับหลังเครื่องหมายอัฒภาค ดังนั้นจึงทำงานได้ตามที่คาดไว้

person lwi    schedule 09.12.2013