Rumah >pembangunan bahagian belakang >C++ >Mengapa Kod C Ini Mencetak 'ba' Daripada 'ab'?

Mengapa Kod C Ini Mencetak 'ba' Daripada 'ab'?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-31 16:01:10907semak imbas

Why Does This C   Code Print

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn