Evet, zorunlu kılar (hem değerlendirme sırası hem de kısa devre). Örneğinizde, tüm işlevler true değerini döndürürse, çağrıların sırası kesinlikle functionA, sonra functionB ve sonra functionC'den gelir. Bunun için kullanılır
if(ptr && ptr->value) {
...
}
Virgül operatörü için aynı:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
Bir sol ve sağ işlenen arasında söyler &&
, ||
, ,
ve birinci ve ikinci / üçüncü işlenen arasında ?:
(şartlı operatör) bir "sekans noktası" dır. Herhangi bir yan etki bu noktadan önce tamamen değerlendirilir. Yani, bu güvenli:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
Virgül operatörünün, şeyleri ayırmak için kullanılan sözdizimsel virgülüyle karıştırılmaması gerektiğini unutmayın:
// order of calls to a and b is unspecified!
function(a(), b());
C ++ Standardı şöyle diyor 5.14/1
:
&& operatör grupları soldan sağa. İşlenenler her ikisi de dolaylı olarak bool türüne dönüştürülür (madde 4). Her iki işlenen de doğru ve yanlışsa sonuç doğrudur. &, &&, soldan sağa değerlendirmenin aksine: ilk işlenen yanlışsa ikinci işlenen değerlendirilmez.
Ve içinde 5.15/1
:
|| operatör grupları soldan sağa. Her iki işlenen de dolaylı olarak boole dönüştürülür (madde 4). İşlenenlerinden herhangi biri doğruysa true değerini, aksi halde false değerini döndürür. Aksine |, || soldan sağa değerlendirmeyi garanti eder; ayrıca, ilk işlenen doğru olarak değerlendirilirse ikinci işlenen değerlendirilmez.
Her ikisinin de yanında şunları söylüyor:
Sonuç bir bool. Geçici ifadelerin (12.2) imha edilmesi dışında ilk ifadenin tüm yan etkileri ikinci ifadenin değerlendirilmesinden önce meydana gelir.
Buna ek olarak, 1.9/18
diyor
İfadelerin her birinin değerlendirilmesinde
a && b
a || b
a ? b : C
a , b
bu ifadelerde (5.14, 5.15, 5.16, 5.18) operatörlerin yerleşik anlamını kullanarak, ilk ifadenin değerlendirilmesinden sonra bir sıralama noktası vardır.