Enigma "cout << a << a": Membongkar Tingkah Laku Tidak Ditakrifkan
Persoalan temu bual yang membingungkan baru-baru ini tercetus perbahasan: apakah output yang betul untuk pernyataan berikut?
int a = 0; cout << a++ << a;
Beberapa calon dengan yakin memilih "01", manakala yang lain membuat alasan bahawa tingkah laku itu tidak ditentukan—jawapan yang pada mulanya mengejutkan sesetengah pihak.
Inti perkara ini terletak pada susunan penilaian dan kesan sampingan kenyataan itu. Untuk memahami perkara ini, mari kita kembangkannya ke dalam panggilan fungsi yang setara:
std::operator<<(std::operator<<(std::cout, a++), a);
C menjamin bahawa kesan sampingan penilaian sebelumnya akan dilakukan pada titik jujukan. Walau bagaimanapun, tiada titik jujukan antara penilaian hujah, menyebabkan susunan penilaian hujah tidak pasti—sama ada a boleh dinilai sebelum a atau sebaliknya.
Kekaburan dalam susunan penilaian ini menjadikan gelagat pernyataan tidak ditentukan. Walau bagaimanapun, dalam kes a dan a, hasil yang pertama digunakan sebagai hujah untuk yang terakhir, menjadikan output bergantung pada susunan penilaian.
C 17 Kemas Kini: Kejelasan Di Tengah-tengah Kekaburan
Dalam C 17, peraturan telah berkembang. Kenyataan khusus mengenai operator syif telah diperkenalkan, menetapkan bahawa penilaian dan kesan sampingan operan kiri mesti berlaku sebelum operan kanan.
In a shift operator expression E1<>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2. Melalui mandat ini, ungkapan "a
Pemurnian ini dalam semantik memastikan kejelasan dan ketekalan dalam penilaian ungkapan yang melibatkan operator anjakan, sejajar dengan amalan C idiomatik.
Atas ialah kandungan terperinci Apakah Output 'cout. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!