Jika kita memiliki tiga fungsi (foo, bar, dan baz) yang dikomposisikan seperti ...
foo(bar(), baz())
Apakah ada jaminan oleh standar C ++ bahwa bar akan dievaluasi sebelum baz?
Tidak, tidak ada jaminan seperti itu. Ini tidak ditentukan menurut standar C ++.
Bjarne Stroustrup juga mengatakannya secara eksplisit dalam "The C ++ Programming Language" edisi ke-3 bagian 6.2.2, dengan beberapa alasan:
Kode yang lebih baik dapat dihasilkan tanpa adanya batasan pada urutan evaluasi ekspresi
Meskipun secara teknis ini mengacu pada bagian awal dari bagian yang sama yang mengatakan bahwa urutan evaluasi bagian ekspresi juga tidak ditentukan, yaitu
int x = f(2) + g(3); // unspecified whether f() or g() is called first
Dari [5.2.2] Panggilan fungsi,
Oleh karena itu, tidak ada jaminan yang
bar()
akan berjalan sebelumnyabaz()
, hanya itubar()
danbaz()
akan dipanggil sebelumnyafoo
.Perhatikan juga dari [5] Ekspresi bahwa:
jadi meskipun Anda bertanya apakah
bar()
akan dijalankan sebelumnyabaz()
dalamfoo(bar() + baz())
, urutannya masih belum ditentukan.sumber
&
,&&
menjamin evaluasi kiri-ke-kanan: operan kedua tidak dievaluasi jika operan pertama adalahfalse
."Tidak ada urutan tertentu untuk bar () dan baz () - satu-satunya hal yang dikatakan Standar adalah bahwa keduanya akan dievaluasi sebelum foo () dipanggil. Dari C ++ Standard, bagian 5.2.2 / 8:
sumber
bar
, lalu baris 1baz
, lalu baris 2bar
, dll.), Yang juga bagus. :-)C ++ 17 menentukan urutan evaluasi untuk operator yang tidak ditentukan hingga C ++ 17. Lihat pertanyaan Apa jaminan urutan evaluasi yang diperkenalkan oleh C ++ 17? Tapi perhatikan ekspresi Anda
memiliki urutan evaluasi yang masih belum ditentukan.
sumber
Di C ++ 11, teks yang relevan dapat ditemukan di 8.3.6 Argumen default / 9 (Emphasis mine)
Kata-kata yang sama digunakan oleh standar C ++ 14 juga, dan ditemukan di bawah bagian yang sama .
sumber
Seperti yang telah ditunjukkan oleh orang lain, standar ini tidak memberikan panduan apa pun tentang urutan evaluasi untuk skenario khusus ini. Urutan evaluasi ini kemudian diserahkan kepada kompilator, dan kompilator mungkin memiliki jaminan.
Penting untuk diingat bahwa standar C ++ sebenarnya adalah bahasa yang menginstruksikan kompiler untuk membuat kode assembly / mesin. Standar hanyalah salah satu bagian dari persamaan. Jika standarnya ambigu atau secara spesifik ditentukan oleh implementasi, Anda harus beralih ke compiler dan memahami cara menerjemahkan instruksi C ++ ke dalam bahasa mesin yang sebenarnya.
Jadi, jika urutan evaluasi adalah suatu persyaratan, atau setidaknya penting, dan menjadi kompatibel lintas-kompiler bukanlah suatu persyaratan, selidiki bagaimana kompiler Anda pada akhirnya akan menyatukannya, jawaban Anda mungkin terletak di sana. Perhatikan bahwa kompilator dapat mengubah metodologi itu di masa mendatang
sumber