คุณสามารถดีบักโค้ดของคุณได้อย่างง่ายดายด้วยวิธีนี้ เมื่อคุณใช้cout
เอาต์พุตของคุณจะถูกบัฟเฟอร์เพื่อให้คุณสามารถวิเคราะห์ได้ดังนี้:
ลองนึกภาพครั้งแรกที่cout
แสดงถึงบัฟเฟอร์และตัวดำเนินการ<<
แทนการต่อท้ายของบัฟเฟอร์ ผลการดำเนินการเป็นกระแสออกในกรณีของคุณ<<
cout
คุณเริ่มจาก:
cout << "2+3 = " << cout << 2 + 3 << endl;
หลังจากใช้กฎที่ระบุไว้ข้างต้นคุณจะได้รับชุดการดำเนินการดังนี้:
buffer.append("2+3 = ").append(cout).append(2 + 3).append(endl);
อย่างที่ฉันได้กล่าวไปแล้วก่อนหน้านี้ผลลัพธ์ของbuffer.append()
คือบัฟเฟอร์ เมื่อเริ่มต้นบัฟเฟอร์ของคุณว่างเปล่าและคุณมีคำสั่งต่อไปนี้ที่ต้องดำเนินการ:
คำให้การ: buffer.append("2+3 = ").append(cout).append(2 + 3).append(endl);
กันชน: empty
แรกที่คุณต้องซึ่งทำให้สตริงที่กำหนดลงในบัฟเฟอร์โดยตรงและจะกลายเป็นbuffer.append("2+3 = ")
buffer
ตอนนี้สถานะของคุณมีลักษณะดังนี้:
คำให้การ: buffer.append(cout).append(2 + 3).append(endl);
กันชน: 2+3 =
หลังจากนั้นคุณจะวิเคราะห์คำสั่งของคุณต่อไปและคุณพบcout
ว่าเป็นอาร์กิวเมนต์ที่จะผนวกท้ายบัฟเฟอร์ cout
จะถือว่าเป็น1
ดังนั้นคุณจะผนวก1
ไปยังจุดสิ้นสุดของบัฟเฟอร์ของคุณ ตอนนี้คุณอยู่ในสถานะนี้:
คำให้การ: buffer.append(2 + 3).append(endl);
กันชน: 2+3 = 1
สิ่งต่อไปที่คุณมีในบัฟเฟอร์คือ2 + 3
และเนื่องจากการเพิ่มมีลำดับความสำคัญสูงกว่าตัวดำเนินการเอาต์พุตคุณจะต้องเพิ่มตัวเลขสองตัวนี้ก่อนจากนั้นคุณจะใส่ผลลัพธ์ในบัฟเฟอร์ หลังจากนั้นคุณจะได้รับ:
คำให้การ: buffer.append(endl);
กันชน: 2+3 = 15
ในที่สุดคุณก็เพิ่มมูลค่าendl
ในตอนท้ายของบัฟเฟอร์และคุณมี:
คำให้การ:
กันชน: 2+3 = 15\n
หลังจากกระบวนการนี้อักขระจากบัฟเฟอร์จะถูกพิมพ์จากบัฟเฟอร์ไปยังเอาต์พุตมาตรฐานทีละตัว 2+3 = 15
ดังนั้นผลของรหัสของคุณคือ หากคุณดูสิ่งนี้คุณจะได้รับเพิ่มเติม1
จากที่cout
คุณพยายามพิมพ์ โดยการลบออก<< cout
จากคำสั่งของคุณคุณจะได้ผลลัพธ์ที่ต้องการ
;
<<
คุณไม่ได้พิมพ์สิ่งที่คุณคิดว่าคุณกำลังพิมพ์ คุณกำลังทำcout << cout
สิ่งที่พิมพ์1
(cout.operator bool()
ฉันคิดว่า) จากนั้น5
(จาก2+3
) ตามมาทันทีทำให้ดูเหมือนเลขสิบห้า