2013-08-26 6 views
5
int main(void) 
{ 
    int a=0, b=20; 
    char x=1, y=10; 
    if(a,b,x,y) 
    printf("bye"); 
    return 0; 
} 

Как работает условие «если» в приведенном выше коде? Будет ли значение «y» рассматриваться только «если»?if (a, b, c, d) как это работает?

+0

чтения Http: // StackOverflow.com/questions/17785206/why-do-this-c-code-compile-what-do-it-do/17785232 # 17785232 –

+0

начать принимать ответ. – Tirth

ответ

17

Да, значение оператора запятой является правильным операндом. Поскольку ни один из других операндов не имеет побочных эффектов, это сводится к if (y).

+0

это означает, что если a, b, c будет «ложным», даже тогда он будет напрямую перейти к y только? –

+4

@Deepanshu Нет, [оператор запятой] (http://en.wikipedia.org/wiki/Comma_operator) не заботится о значении любых операндов, кроме последнего. Все они оцениваются и результат отбрасывается, нет [оценки короткого замыкания] (http://en.wikipedia.org/wiki/Short-circuit_evaluation). – unwind

+0

Возможно. Используйте '&&' или '||' вместе с '(' и ')', если вы хотите использовать некоторые из них или все из них. – haneefmubarak

6

От Wikipedia:

В C и C++ языков программирования, оператор запятой (представленный маркером,) представляет собой бинарный оператор, который оценивает его первого операнда и отбрасывает результат, а затем оценивает второй операнд и возвращает это значение (и тип).

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

В if(a,b,x,y) рассматривается только истинность y, и все, что оценивалось y, будет считаться истинным/ложным.

В вашем случае y равно 10, который считается true в C, поэтому if проверка также будет вычисляться true и if блок будет введен.

Возможно, вы захотите рассмотреть this very popular question на StackOverflow для использования (и злоупотреблений).

+2

Я полагаю, справедливо, что вопрос, который должен быть справедливо закрыт из-за отсутствия исследований, получает ответ от Википедии. –

4

Оператор , (запятая) разделяет выражение. Если несколько значений заключены в круглую скобку, то последнее значение в круглой скобке присваивается переменной.

e.g a=(x,y,z); 
then a=z; 

, а если

a=x,y,z; 

затем выше выражение получает оценку в (a=x);

this См.

+1

Оператор запятой имеет наименьшее приоритет. – ajay

+2

@YuHao Конечно, это скомпилирует ... он определяет a, y и z, инициализируя a. То, что не будет компилироваться, это 'int (a = x), y, z;', что делает этот ответ неправильным. R.S .: запятая - это только оператор в выражениях. '(x, y, z)' - выражение инициализатора, поэтому запятая - это оператор. Но объявления не являются выражениями, поэтому 'int (a = x), y, z;' является бессмыслицей и эта часть вашего ответа должна быть переформулирована. –

0

Как Joey сказал выше, это имеет значение ничего более

if (y) 
    .... 

Важно заметить, что если ваш код гласил:

int main(void) 
{ 
    int a=0, b=20; 
    char x=1, y=10; 
    if(a++,b++,x++,y) 
    printf("%d, %d, %d, %d\n", a, b, (int)c, (int)y); 
    return 0; 
} 

Выход был бы

1, 21, 2, 10 

Все приращения были бы выполнены, но для целей оценки t он кондиционировать

(a++,b++,x++,y) 

только одно, что имеет значение является последним, а именно y

Смежные вопросы