Запятая против оператора && в циклах и if-else

Рассмотрим код:

if(x = a/b, a%b) 
 printf("do this");
else 
 printf("do that");

Теперь, если я заменю if заявление if(x = a/b && a % b), Тогда это работает также. Поэтому я хочу знать, что замена запятой на && оператор и наоборот работает всегда или нет в if-else and loops

4 ответа

Решение

Они совершенно разные!


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

Так,

if(x = a/b, a%b) 

эквивалентно (спасибо @jaket)

x = a/b;
if(a%b) 

a%b всегда будет оцениваться.


Для второго:

if(x = a/b && a % b)

эквивалентно

x = (a/b) && (a%b);
if( x )

a%b будет оцениваться только если a/b (т.е. a/b не ноль) верно.

Если вы замените оператор запятой на &&, вы слегка измените логику. Оператор запятой будет выполнять x = a/b и "отбрасывать результат", то есть он не учитывается для условия if, учитывается только%b.

если вы делаете

if(x = a/b && a % b)

тогда "сделать это" будет напечатано, если и только если a / b не равен нулю и a%b не равен нулю. В то время как с оператором запятой "do this" печатается, только если a%b не ноль.

if(x = a/b, a%b)

это запутанный, нечитаемый способ написания

x = a/b;
if(a%b)

Но

x = a/b && a % b

эквивалентно

x = ( (a/b) && (a%b) );

Подводя итог, не смешивайте много разных операторов в одной строке. Единственное, чего вы добились, это запутать себя, создавая ошибки.

Оператор && форсирует результат a/b а также во внимание при определении выражения x = a/b && a%b, В случае ,, результат a/b игнорируется Так что замена , с && не будет работать всегда. И не то, что нужно делать,

Другие вопросы по тегам