Фактический ответ:
- Компилятор отдает приоритет "i == 0", что соответствует истине.
- Затем он будет оценивать i = 1 как TRUE или FALSE, и поскольку скомпилированные операторы присваивания никогда не завершаются ошибкой (иначе они не будут компилироваться), он также оценивается как true.
- Поскольку оба оператора оцениваются как истинные, а TRUE && TRUE оценивается как TRUE, оператор if будет оцениваться как TRUE.
В качестве доказательства, просто посмотрите на вывод asm вашего компилятора для кода, который вы ввели (все комментарии мои):
mov dword ptr [rbp - 8], 0 ; i = 0;
cmp dword ptr [rbp - 8], 0 ; i == 0?
sete al ; TRUE (=1)
mov cl, al
and cl, 1 ; = operator always TRUE
movzx edx, cl
mov dword ptr [rbp - 8], edx ; set i=TRUE;
test al, 1 ; al never changed,
; so final ans is TRUE
Вывод asm выше был из CLANG, но все остальные компиляторы, на которые я смотрел, давали похожий вывод. Это верно для всех компиляторов на этом сайте, будь то чистые компиляторы C или C ++, все без каких-либо прагм для изменения режима компилятора (который по умолчанию является C ++ для компиляторов C ++)
Обратите внимание, что ваш компилятор на самом деле не установил i = 1, но i = TRUE (что означает любое 32-битное не нулевое целое значение). Это связано с тем, что оператор && только оценивает, является ли оператор TRUE или FALSE, а затем устанавливает результаты в соответствии с этим результатом. В качестве доказательства попробуйте изменить i = 1 на i = 2, и вы сами сможете убедиться, что ничего не изменится. Убедитесь сами, используя любой онлайн-компилятор в Compiler Explorer
i
него установлено значение1
.