Запятая против оператора && в циклах и 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
игнорируется Так что замена ,
с &&
не будет работать всегда. И не то, что нужно делать,