Использование присваивания в качестве выражения условия? - PullRequest
5 голосов
/ 24 июля 2011

Рассмотрим:

if (a=5) {
   /* do something */
}

Как назначение выполняется как условие?

Основано ли оно на ненулевом значении l-значения?

Ответы [ 4 ]

22 голосов
/ 24 июля 2011

C ++ & mdash; ISO / IEC 14882: 2003 (E)

[5.17/1] Есть несколько операторов присваивания, все из которых группа справа налево. Все требуют изменяемого lvalue в качестве своего левого операнда, и тип выражения присваивания является типом его левого операнда. Результатом операции присваивания является значение, сохраненное слева операнд после присвоения ; результат lvalue.

Результат выражения a = 5 равен 5.

[6.4/4] [..] Значение условия , которое является выражением, является значением выражение неявно преобразуется в bool для операторов, отличных от switch. [..]

Происходит преобразование в bool.

[4.12/1] Значение арифметики, перечисления, указателя или указателя на член Тип можно преобразовать в значение типа bool. Нулевое значение, ноль значение указателя или значение указателя нулевого элемента преобразуется в false; любой другое значение преобразуется в true.

5 преобразуется в логическое значение true.

[6.4.1/1] Если условие (6.4) возвращает true, то первое подзапись выполнена. [..]

true рассматривается как if оператор успешно.


C & mdash; ISO / IEC 9899: 1999 (E)

[6.5.16/3] Оператор присваивания сохраняет значение в объекте обозначен левым операндом. Выражение присваивания имеет значение левого операнда после присваивания , но не является lvalue. [..]

Результат выражения a = 5 равен 5.

[6.8.4.1/2] В обеих формах первое подзаголовок выполняется, если Выражение сравнивается с неравным 0 . [..]

5 считается успешным if.


Общее

Код, подобный этому, почти всегда является ошибкой; автор, скорее всего, намеревался if (a == 5) {}. Однако иногда это умышленно. Вы можете увидеть код, подобный этому:

if (x = foo()) {
   cout << "I set x to the result of foo(), which is truthy";
   // ... stuff
}
1 голос
/ 24 июля 2011

Каждое ненулевое значение будет рассматриваться как true .

Поэтому некоторые люди предложат вам написать

5 == a

, чтобы избежать ошибки == = .

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

if(a=x) эквивалентно if(x) в дополнение к a, присвоенному x. Таким образом, если выражение x оценивается как ненулевое значение, тогда if(x) просто становится if(true). В противном случае оно становится if(false).

В вашем случае, поскольку x = 5, это означает, что f(a=5) эквивалентно if(true) в дополнение к a, присвоенному 5.

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

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

a = 5;
...
if (a != 0) {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...