Rumah >pembangunan bahagian belakang >C++ >Mengapa Kod C Ini Mencetak 'ba' Daripada 'ab'?
Menyingkap Misteri Pencetakan Kiri-ke-kanan dalam C
Kelakuan kod C berikut membingungkan:
myQueue.enqueue('a'); myQueue.enqueue('b'); cout << myQueue.dequeue() << myQueue.dequeue();
Anehnya, ia mencetak "ba" ke konsol dan bukannya "ab" yang dijangkakan. Mengapa ini berlaku?
Untuk merungkai enigma ini, kita perlu memahami sifat << pengendali. Dalam C , << operator mengambil bilangan hujah yang sewenang-wenangnya dan mengembalikan rujukan kepada objek ostream. Dalam kes ini, cout ialah objek ostream.
Turutan penilaian hujah kepada << tidak dijamin oleh piawaian C. Ini bermakna pengkompil bebas untuk menilai hujah dalam sebarang susunan, termasuk kemungkinan menilai mereka tidak tertib.
Dalam contoh kami, kod tersebut dikompil ke dalam ungkapan bentuk:
cout << ( (myQueue.dequeue()) << (myQueue.dequeue()) );
Pengkompil memasukkan kurungan di sekeliling setiap panggilan dequeue dan di sekitar hasil panggilan rekursif. Hasil daripada panggilan dequeue kedua kemudiannya dimasukkan ke dalam kurungan yang mengelilingi yang pertama.
Kunci untuk memahami tingkah laku adalah untuk menyedari bahawa hujah kepada << operator dinilai dalam susunan kanan ke kiri. Oleh itu, perkara berikut adalah bersamaan dengan kod di atas:
( (myQueue.dequeue()) << (myQueue.dequeue()) ) << cout;
Dalam susunan ini, panggilan dequeue kedua dinilai terlebih dahulu, menghasilkan 'b'. Hasil panggilan ini kemudiannya dihantar ke << operator, yang mengembalikan rujukan kepada cout. Panggilan dequeue pertama kemudian dinilai, menghasilkan 'a', yang dihantar kepada rujukan yang dikembalikan oleh << operator.
Ini menerangkan sebab kod mencetak "ba" dan bukannya "ab". << pengendali mula-mula mencetak 'b', dan kemudian mencetak 'a'.
Untuk memastikan pencetakan kiri-ke-kanan yang konsisten, kurungan hendaklah digunakan untuk mengawal susunan penilaian secara eksplisit, seperti berikut:
cout << (myQueue.dequeue()) << ' ' << (myQueue.dequeue());
Atas ialah kandungan terperinci Mengapa Kod C Ini Mencetak 'ba' Daripada 'ab'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!