Tak, nakazuje to (zarówno kolejność oceny, jak i zwarcie). W naszym przykładzie, jeśli wszystkie funkcje zwracają wartość true, kolejność wywołań pochodzi ściśle od functionA, następnie functionB, a następnie functionC. Używany do tego jak
if(ptr && ptr->value) {
...
}
To samo dotyczy operatora przecinka:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
Mówi się od lewego i prawego argumentu instrukcji &&
, ||
, ,
a pomiędzy pierwszą i drugą / trzecią operandu ?:
(operator warunkowych) stanowi „punkt sekwencji”. Wszelkie skutki uboczne są oceniane całkowicie przed tym punktem. Więc to jest bezpieczne:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
Zauważ, że operatora przecinka nie należy mylić z przecinkiem składniowym używanym do oddzielania rzeczy:
// order of calls to a and b is unspecified!
function(a(), b());
Standard C ++ mówi w 5.14/1
:
Operator && grupuje od lewej do prawej. Operandy są niejawnie konwertowane na typ bool (klauzula 4). Wynik jest prawdziwy, jeśli oba operandy są prawdziwe i fałszywe w przeciwnym razie. W przeciwieństwie do &, && gwarantuje ocenę od lewej do prawej: drugi argument nie jest oceniany, jeśli pierwszy operand jest fałszywy.
A w 5.15/1
:
|| grupy operatorów od lewej do prawej. Oba operandy są niejawnie konwertowane na bool (klauzula 4). Zwraca prawdę, jeśli którykolwiek z jej operandów jest prawdziwy, a fałsz w przeciwnym razie. W przeciwieństwie do |, || gwarantuje ocenę od lewej do prawej; co więcej, drugi argument nie jest oceniany, jeśli wynik pierwszego argumentu jest prawdziwy.
Mówi o obu obok tych:
Rezultatem jest bool. Wszystkie skutki uboczne pierwszego wyrażenia z wyjątkiem zniszczenia prowizorycznych (12.2) występują przed oceną drugiego wyrażenia.
Oprócz tego, 1.9/18
mówi
W ocenie każdego z wyrażeń
a && b
a || b
a ? b : C
a , b
Używając wbudowanego znaczenia operatorów w tych wyrażeniach (5.14, 5.15, 5.16, 5.18), po ocenie pierwszego wyrażenia znajduje się punkt sekwencji.