คุณสามารถดีบักโค้ดของคุณได้อย่างง่ายดายด้วยวิธีนี้ เมื่อคุณใช้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) ตามมาทันทีทำให้ดูเหมือนเลขสิบห้า