Operator C++ std::cout dan ‹‹, prioritas [duplikat]

Saya punya kode seperti ini:

std::cout << " a: " << classDate.getDays() << " b: " << classDate++ << " c: " << classDate.getDays();

Saya membebani operator pasca kenaikan secara berlebihan.

di kelas m_days variabel memiliki nilai:

  • sebelum operator ++ - 4
  • setelah ++ operator -5

Pertanyaan saya adalah, mengapa hasil dari cout urutannya salah:

a: 5 b: 5 c: 4

Saya memeriksanya di debuger, nilai di kelas sudah benar. Ketika saya menulis kode seperti ini:

std::cout << " a: " << classDate.getDays();
std::cout << " b: " << classDate++;
std::cout << " c: " << classDate.getDays();

semuanya benar (a:4 b:5 c:5).

Apakah itu masalah prioritas operator?

Kamil


person e2p    schedule 09.12.2013    source sumber
comment
Saya tidak yakin bagaimana Anda mendapatkan b: 5 saat Anda menggunakan pasca-kenaikan. Apakah ini kode persis yang Anda gunakan?   -  person David Brown    schedule 10.12.2013
comment
Maaf, saya lupa. pasca kenaikan mengembalikan nilai baru sebagai bilangan bulat.   -  person e2p    schedule 10.12.2013
comment
@kolumb Kemudian Anda telah mengimplementasikan awalan ++ dan menyebutnya postfix. Setidaknya pengelola kode Anda di masa depan akan kesulitan memahami hal ini.   -  person Mark B    schedule 10.12.2013


Jawaban (3)


Urutan evaluasi tidak ditentukan.

Lihatlah jawaban ini, penjelasan yang bagus tentang ini jenis hasil

person Marcassin    schedule 09.12.2013

Dalam C++ urutan evaluasi argumen fungsi (dan operator<< kelebihan beban yang digunakan di sini hanyalah sebuah fungsi) tidak ditentukan sehingga kompiler bebas mengevaluasi classDate++ serta setiap classDate.getDays() dalam urutan apa pun yang dipilihnya. Jadi dengan kompiler berbeda atau opsi kompilasi berbeda, Anda bisa mendapatkannya

a: 4 b: 5 c: 4
a: 4 b: 5 c: 5
a: 5 b: 5 c: 4
a: 5 b: 5 c: 5

Jika Anda ingin outputnya dievaluasi dalam urutan tertentu, Anda harus meletakkan outputnya dalam pernyataan septate seperti pada contoh kedua.

person David Brown    schedule 09.12.2013

Dugaan saya, operator ++ sebenarnya menyebabkan efek samping yang dijamin terjadi setelah titik urutan (lihat http://en.wikipedia.org/wiki/Sequence_point dan Perilaku tidak terdefinisi dan titik urutan).

Hingga mencapai titik urutan, ini bergantung pada kompiler ketika ekspresi dievaluasi. Jadi Anda tidak bisa mengandalkan urutan evaluasi ekspresi Anda.

Dalam contoh kedua Anda, ada titik urutan setelah titik koma, oleh karena itu ini berfungsi seperti yang diharapkan.

person lwi    schedule 09.12.2013