Почему этот код ничего не выводит? - PullRequest
4 голосов
/ 14 мая 2010

Подумайте над вопросом "ЭКЗАМ":

int main()
{
   int a=10,b=20;
   char x=1,y=0;
   if(a,b,x,y)
   {
      printf("EXAM");
   }
}

Пожалуйста, дайте мне знать, почему это вообще ничего не печатает.

Ответы [ 5 ]

11 голосов
/ 14 мая 2010

Оператор запятой - вычисляет первое выражение и возвращает второе. Таким образом, a,b,x,y вернет значение, хранящееся в y, то есть 0.

3 голосов
/ 14 мая 2010

Результат a,b,x,y равен y (потому что оператор запятой вычисляется как результат его правого операнда), а y равно 0, что ложно.

2 голосов
/ 14 мая 2010

Оператор запятой возвращает последний оператор, который является y. Поскольку y равно нулю, оператор if оценивается как ложный, поэтому printf никогда не выполняется.

1 голос
/ 14 мая 2010

Поскольку выражение a,b,x,y оценивается как y, что, в свою очередь, оценивается как 0, поэтому соответствующий блок никогда не выполняется. Оператор запятой выполняет каждое утверждение и возвращает значение последнего. Если вы хотите логическое соединение, используйте оператор &&:

if (a && b && x && y) { ... }
0 голосов
/ 14 мая 2010

Другие уже упоминали, что оператор запятой возвращает самое правое значение. Если вы хотите напечатать значение, если ЛЮБАЯ из этих переменных является истинной, используйте логическое или:

int main()
{
   int a=10,b=20;
   char x=1,y=0;
   if(a || b || x || y)
   {
      printf("EXAM");
   }
 }

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

int a = 1;
int b;
if(a || b = 1) { ... }

b имеет неопределенное значение, тогда как с

int a = 1;
int b;
if(a, b = 1) { ... }

b будет установлен в 1.

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