Может кто-нибудь объяснить этот пример C ++ оператор короткого замыкания? - PullRequest
12 голосов
/ 04 мая 2011

Может кто-нибудь объяснить этот пример короткого замыкания оператора запятой C ++?

bIsTRUE     = true, false, true;
bIsFALSE    = (true, false), true;
bIsAlsoTRUE = ((true, false), true);

Почему вторая версия замыкается и возвращает false (по крайней мере, в MSVC ++), а две другие версии не возвращают true ?

1 Ответ

28 голосов
/ 04 мая 2011

Оператор запятой имеет более низкий приоритет, чем присваивание, поэтому они анализируются как

(bIsTRUE     = true), false, true;     
(bIsFALSE    = (true, false)), true;   
(bIsAlsoTRUE = ((true, false), true)); 

Оператор запятой не замыкает накоротко. Он оценивает свой левый операнд, игнорирует результат, а затем оценивает свой правый операнд.

bIsTRUE равно true, поскольку правый операнд присваивания равен true.

bIsFALSE равно false, поскольку (true, false) оценивает true, игнорирует результат, затем оценивает и выдает false.

bIsAlsoTRUE равно true, поскольку ((true, false), true) оценивает (true, false), игнорирует результат, затем оценивает и выдает true.

...