Urutan evaluasi tidak ditentukan oleh standar C++ (atau C) (lihat jawaban dari Vlad). Jika function_1
atau function_2
Anda memiliki efek samping yang signifikan, ini mungkin berupa beberapa < a href="http://en.wikipedia.org/wiki/Unspecified_behavior" rel="nofollow noreferrer">perilaku yang tidak ditentukan yang harus benar-benar Anda hindari (seperti Anda harus menghindari perilaku tidak terdefinisi). Dan dalam beberapa kasus (fungsi sebaris dengan optimalisasi yang kuat) perhitungannya mungkin tercampur.
Pikirkan tentang kasus-kasus aneh seperti
static int i;
int function_1(void) { i++; return i; }
int function_2(void) { i+=2; return 3*i+1; }
Ini mungkin spesifik untuk implementasi, dan mungkin bergantung pada kompiler sebenarnya dan tanda optimasi.
Anda harus membuat kode seolah-olah urutan pemanggilan fungsi benar-benar acak dan tidak dapat direproduksi (walaupun dalam praktiknya mungkin dapat direproduksi). Demikian pula, Anda tidak boleh mengharapkan urutan evaluasi argumen tertentu (misalnya di f(i++, ++j)
Anda tidak tahu apakah i
atau j
telah bertambah terlebih dahulu), bahkan jika untuk kompiler tertentu urutan tersebut mungkin diperbaiki. Sekali lagi, Anda harus membayangkan urutan yang benar-benar acak dan tidak dapat direproduksi.
Seperti yang dikomentari oleh David Schwartz, jika Anda peduli dengan urutannya, Anda harus membuat kode secara eksplisit beberapa poin urutan
Pada akhirnya, jika kode Anda bergantung pada beberapa urutan, kode tersebut sama sekali tidak dapat dibaca dan karena alasan keterbacaan yang sederhana, Anda sebaiknya menghindari pengkodean dengan cara ini.
person
Basile Starynkevitch
schedule
29.10.2014