Operator C trójskładnikowy nigdy nie zwarcie, ponieważ tylko jeden ocenia ekspresji (warunkiem), w celu określenia wartości podanej przez wyrażenia b i c , o ile może być zwrócony dowolna.
Poniższy kod:
int ret = a ? b : c;
Jest to prawie równoważne z następującym kodem:
int ret;
if(a) {ret = b} else {ret = c}
Wyrażenie a może być utworzone przez inne operatory, takie jak && lub || które mogą spowodować zwarcie, ponieważ mogą oszacować dwa wyrażenia przed zwróceniem wartości, ale nie byłoby to traktowane jako operator trójskładnikowy powodujący zwarcie, ale operatory używane w warunku, tak jak w zwykłej instrukcji if.
Aktualizacja:
Trwa dyskusja, czy operator trójskładnikowy jest operatorem zwarcia. Argument mówi, że każdy operator, który nie ocenia wszystkich swoich operandów, wykonuje zwarcie zgodnie z @aruisdante w komentarzu poniżej. Gdyby podano tę definicję, operator trójskładnikowy byłby zwarty iw przypadku, gdy jest to oryginalna definicja, zgadzam się. Problem polega na tym, że termin „zwarcie” był pierwotnie używany w odniesieniu do określonego rodzaju operatora, który pozwalał na takie zachowanie i są to operatory logiczne / boolowskie, a powód, dla którego są tylko takie, postaram się wyjaśnić.
Zgodnie z artykułem Ocena zwarcia, ocena zwarcia odnosi się tylko do operatorów logicznych zaimplementowanych w języku w taki sposób, że wiedząc, że pierwszy argument sprawi, że drugi będzie nieistotny, to znaczy dla operatora && będącego pierwszym operandem fałszywym , a dla || operator jest pierwszym operandem, który jest prawdziwy , specyfikacja C11 zauważa to również w 6.5.13 Operator logiczny AND i 6.5.14 Operator logiczny OR.
Oznacza to, że aby zidentyfikować zachowanie zwarciowe, można by oczekiwać, że zostanie ono zidentyfikowane w operatorze, który musi ocenić wszystkie operandy, tak jak operatory boolowskie, jeśli pierwszy operand nie sprawia, że drugi jest nieistotny. Jest to zgodne z tym, co jest napisane w innej definicji zwarcia w MathWorks w sekcji „Zwarcie logiczne”, ponieważ zwarcie pochodzi od operatorów logicznych.
Ponieważ próbowałem wyjaśnić operator trójskładnikowy, nazywany również trójskładnikowym, jeśli oblicza tylko dwa argumenty, oblicza pierwszy, a następnie ocenia drugi, jeden z dwóch pozostałych w zależności od wartości pierwszy. Robi to zawsze, nie powinno oceniać wszystkich trzech w żadnej sytuacji, więc w żadnym wypadku nie ma „zwarcia”.
Jak zawsze, jeśli zauważysz, że coś jest nie tak, napisz komentarz z argumentem przeciwko temu, a nie tylko negatywnym głosem, to tylko pogarsza wrażenia z SO i wierzę, że możemy być znacznie lepszą społecznością, która po prostu przegrywa z którym się nie zgadza.