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
}