Secara teknis, secara keseluruhan ini adalah Perilaku yang Tidak Terdefinisi .
Namun, ada dua aspek penting jawabannya.
Pernyataan kode:
std::cout << a++ << a;
dievaluasi sebagai:
std::operator<<(std::operator<<(std::cout, a++), a);
Standar tidak menentukan urutan evaluasi argumen ke suatu fungsi.
Jadi salah satu:
std::operator<<(std::cout, a++)
dievaluasi terlebih dahulu atau
a
dievaluasi terlebih dahulu atau
- itu mungkin saja urutan implementasi yang ditentukan.
Pesanan ini Tidak Ditentukan [Ref 1] sesuai standar.
[Ref 1] C ++ 03 5.2.2 Panggilan fungsi
Para 8
Urutan evaluasi argumen tidak ditentukan . Semua efek samping dari evaluasi ekspresi argumen berlaku sebelum fungsi dimasukkan. Urutan evaluasi ekspresi postfix dan daftar ekspresi argumen tidak ditentukan.
Selanjutnya, tidak ada titik urutan antara evaluasi argumen ke fungsi tetapi titik urutan hanya ada setelah evaluasi semua argumen [Ref 2] .
[Ref 2] C ++ 03 1.9 Eksekusi program [intro.execution]:
Para 17:
Saat memanggil fungsi (baik fungsi sebaris atau tidak), ada titik urutan setelah evaluasi semua argumen fungsi (jika ada) yang terjadi sebelum eksekusi ekspresi atau pernyataan apa pun dalam badan fungsi.
Perhatikan bahwa, di sini nilai c
sedang diakses lebih dari sekali tanpa titik urutan yang mengganggu, standarnya mengatakan:
[Ref 3] C ++ 03 5 Ekspresi [expr]:
Para 4:
....
Antara titik urutan sebelumnya dan berikutnya, nilai simpanan objek skalar harus dimodifikasi paling banyak satu kali dengan evaluasi ekspresi. Lebih lanjut, nilai sebelumnya harus diakses hanya untuk menentukan nilai yang akan disimpan . Persyaratan paragraf ini harus dipenuhi untuk setiap urutan subekspresi lengkap yang diizinkan; jika tidak, perilakunya tidak terdefinisi .
Kode memodifikasi c
lebih dari sekali tanpa mengintervensi titik urutan dan tidak sedang diakses untuk menentukan nilai objek yang disimpan. Ini jelas merupakan pelanggaran terhadap klausul di atas dan karenanya hasil seperti yang diamanatkan oleh standar adalah Perilaku Tidak Terdefinisi [Ref 3] .