Ya, itu mengamanatkan (urutan evaluasi dan hubungan pendek). Dalam contoh Anda jika semua fungsi mengembalikan true, urutan panggilan secara ketat dari functionA lalu functionB dan kemudian functionC. Digunakan untuk seperti ini
if(ptr && ptr->value) {
...
}
Sama untuk operator koma:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
Salah satu kata antara kiri dan operan kanan &&
, ||
, ,
dan antara pertama dan kedua / operan ketiga ?:
(operator kondisional) adalah "titik urutan". Setiap efek samping dievaluasi sepenuhnya sebelum titik itu. Jadi, ini aman:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
Perhatikan bahwa operator koma tidak perlu bingung dengan koma sintaksis yang digunakan untuk memisahkan hal-hal:
// order of calls to a and b is unspecified!
function(a(), b());
Standar C ++ mengatakan 5.14/1
:
Grup && operator kiri-ke-kanan. Operan keduanya secara implisit dikonversi menjadi tipe bool (klausa 4). Hasilnya benar jika kedua operan benar dan salah jika tidak. Tidak seperti &, && menjamin evaluasi dari kiri ke kanan: operan kedua tidak dievaluasi jika operan pertama salah.
Dan di 5.15/1
:
The || grup operator kiri-ke-kanan. Operan keduanya secara implisit dikonversi menjadi bool (klausa 4). Ini mengembalikan true jika salah satu operan-nya benar, dan salah sebaliknya. Berbeda dengan |, || menjamin evaluasi kiri-ke-kanan; selain itu, operan kedua tidak dievaluasi jika operan pertama bernilai true.
Dikatakan untuk keduanya di sebelah:
Hasilnya adalah bool. Semua efek samping dari ekspresi pertama kecuali untuk penghancuran sementara (12.2) terjadi sebelum ekspresi kedua dievaluasi.
Selain itu, 1.9/18
kata
Dalam evaluasi masing-masing ungkapan
a && b
a || b
a ? b : C
a , b
menggunakan makna bawaan dari operator dalam ekspresi ini (5.14, 5.15, 5.16, 5.18), ada titik urutan setelah evaluasi ekspresi pertama.