Фактический ответ:
- Компилятор присваивает приоритет значению "i == 0", что дает значение true.
- Затем он оцениваетi = 1 как TRUE или FALSE, и поскольку скомпилированные операторы присваивания никогда не завершаются ошибкой (в противном случае они не скомпилируются), оно также оценивается как true.
- Поскольку оба оператора оцениваются как 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, но все остальные компиляторы, на которые я смотрел, выдавали похожий вывод.
Обратите внимание, что ваш компилятор на самом деле не установил i = 1, но i = TRUE.Это связано с тем, что оператор && только оценивает, является ли оператор TRUE или FALSE, а затем устанавливает результаты в соответствии с этим результатом.В качестве доказательства попробуйте изменить i = 1 на i = 2, и вы сами сможете убедиться, что ничего не изменится.Убедитесь сами, используя любой онлайн-компилятор на Compiler Explorer