что значит - если (1, правда) - значит? - PullRequest
2 голосов
/ 02 июля 2011

я наткнулся на этот код:

if (1, true) {/*...*/}

Что это на самом деле означает? Пока это оценивается как истина:

void foo(){}
...
if(1, foo()) {/*...*/}

это не компилируется:

void foo(){}
...
if (1 == foo()) {/*...*/}

очевидно, потому что компилятор ожидает, что foo () вернет некоторое целое значение. Я думал, что запятая переводит в какой-то оператор. Означает ли эта запятая в предложении if что-то внутренне?

Ответы [ 5 ]

11 голосов
/ 02 июля 2011

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

(1, true)

сначала оценивает 1, затем true, в результате чего значение выражения true.

В этом конкретном случае использование оператора запятой кажется довольно бессмысленным.

7 голосов
/ 02 июля 2011

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

1 голос
/ 02 июля 2011

Как объяснили другие, это оператор запятой (или последовательной оценки).

Однако второй фрагмент кода также не работает, см. Вывод gcc 4.3.4 . Оператор запятой выполняет все свои операнды в порядке слева направо, обрабатывая каждый из них как одно подвыражение и возвращая значение последнего выражения в цепочке. Поскольку foo() возвращает void, выражение неверно. Если ваш компилятор принимает это, это является нарушением стандарта языка.

1 голос
/ 02 июля 2011

Это оператор запятой. Он оценивает 1, затем true, а затем проверяет, истинно ли true, что и есть, поэтому он выполняет if.

0 голосов
/ 02 июля 2011

Оператор запятой . Оценка слева направо. Результат - результат крайнего правого выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...