Я думал о некоторых ошибках новичка, и я закончил тем, что на if
утверждении. Я немного расширил код до этого:
int i = 0;
if (i = 1 && i == 0) {
std::cout << i;
}
Я видел , что if
оператор возвращает верно, и это cout
«S , i
как 1
. Если в операторе if i
назначено 1
значение, почему i == 0
вернули true
?
c++
if-statement
TehMattGR
источник
источник
i
него установлено значение1
.1 && i == 0
?Ответы:
Это связано с приоритетом оператора .
не является
потому что оба
&&
и==
имеют более высокий приоритет, чем=
. Что это действительно работает, так этокоторый присваивает результат
1 && (i == 0)
кi
. Итак, еслиi
начинается с,0
тоi == 0
естьtrue
, то1 && true
естьtrue
(или1
), а затемi
устанавливается в1
. Тогда, поскольку1
true, вы вводите блок if и печатаете значение, которое вы присвоилиi
.источник
i = !i; if (i)
правильно написаноПредполагая, что ваш код на самом деле выглядит так:
Тогда это:
оценивает как
и так
i
установлено1
.источник
using namespace std
!=
было раньше,&&
может увидеть проблему. Кроме того, да, расширение является посторонним, но я не думаю, что это имеет большое значение. Я не могу поверить, что такие незначительные различия заставляют людей голосовать 151 против -4.Это связано с разбором правил справа налево. Например, у = х + 5.
Все подвыражения взвешены по важности. Два выражения одинаковой важности оцениваются справа налево. Сначала выполняется сторона выражения &&, затем LHS.
Имеет смысл для меня.
источник
Фактический ответ:
В качестве доказательства, просто посмотрите на вывод asm вашего компилятора для кода, который вы ввели (все комментарии мои):
Вывод asm выше был из CLANG, но все остальные компиляторы, на которые я смотрел, давали похожий вывод. Это верно для всех компиляторов на этом сайте, будь то чистые компиляторы C или C ++, все без каких-либо прагм для изменения режима компилятора (который по умолчанию является C ++ для компиляторов C ++)
Обратите внимание, что ваш компилятор на самом деле не установил i = 1, но i = TRUE (что означает любое 32-битное не нулевое целое значение). Это связано с тем, что оператор && только оценивает, является ли оператор TRUE или FALSE, а затем устанавливает результаты в соответствии с этим результатом. В качестве доказательства попробуйте изменить i = 1 на i = 2, и вы сами сможете убедиться, что ничего не изменится. Убедитесь сами, используя любой онлайн-компилятор в Compiler Explorer
источник
i = 1
является оператором присваивания [не эквивалентности]; 2b) Я могу заверить вас, чтоif (i = 0)
в C и C ++ будет выполнено ложное условие, поэтому то, что оно оценивается как истинное по отношению к «никогда не выходит из строя», несколько обманчиво.and cl, 1 ; = operator always TRUE
<< поправьте меня, если я ошибаюсь, но я не вижу здесь никакого назначения. Он представляет собой1 &&
часть выражения. Так что этот ответ в основном оценивается какfalse
.if ( i = 0 ) { print something }
. Также ваш ответ противоречит самому себе; в начале вы говорите, чтоi=1
оценивается до того,&&
как применяется, а затем в конце вы говорите, чтоi
установлено на результат&&
оператора.