Obecnie uczę się C ++ z książką C ++ Primer, a jedno z ćwiczeń w książce to:
Wyjaśnij, co robi to wyrażenie:
someValue ? ++x, ++y : --x, --y
Co wiemy? Wiemy, że operator trójskładnikowy ma wyższy priorytet niż operator przecinka. W przypadku operatorów binarnych było to dość łatwe do zrozumienia, ale z operatorem trójskładnikowym trochę się zmagam. W przypadku operatorów binarnych „mający wyższy priorytet” oznacza, że możemy używać nawiasów wokół wyrażenia o wyższym priorytecie i nie zmieni to wykonania.
Dla operatora trójskładnikowego zrobiłbym:
(someValue ? ++x, ++y : --x, --y)
w efekcie uzyskując ten sam kod, który nie pomaga mi w zrozumieniu, w jaki sposób kompilator pogrupuje kod.
Jednak z testów za pomocą kompilatora C ++ wiem, że wyrażenie kompiluje się i nie wiem, co :
operator mógłby sam oznaczać. Tak więc kompilator wydaje się poprawnie interpretować operator trójskładnikowy.
Następnie wykonałem program na dwa sposoby:
#include <iostream>
int main()
{
bool someValue = true;
int x = 10, y = 10;
someValue ? ++x, ++y : --x, --y;
std::cout << x << " " << y << std::endl;
return 0;
}
Prowadzi do:
11 10
Z drugiej strony z someValue = false
nim drukuje:
9 9
Dlaczego kompilator C ++ miałby generować kod, który dla prawdziwej gałęzi operatora trójskładnikowego tylko zwiększa x
, podczas gdy dla fałszywej gałęzi trójskładnikowej zmniejsza zarówno x
i y
?
Poszedłem nawet do umieszczenia nawiasów wokół prawdziwej gałęzi w następujący sposób:
someValue ? (++x, ++y) : --x, --y;
ale nadal skutkuje 11 10
.
?
jest operatorem warunkowym . Termin operator trójskładnikowy oznacza po prostu operator z trzema argumentami. Operator warunkowy jest jednym z przykładów operatorów trójskładnikowych, ale język mógłby (teoretycznie) mieć wiele operatorów trójskładnikowych.