Компилятор не преобразует условное выражение в логическое значение, пока не решит, какую ветвь оператора if
/ else
следует взять. Вместо этого он генерирует инструкции на ассемблере, как если бы вы написали программу на ассемблере.
Простой пример:
if (x > y)
{
// Do something
}
else
{
// Do something else
}
Можно перевести на (используя фиктивный микроконтроллер):
CMP R12,R13
BLE label1
// Do something
JMP label2
label1:
// Do something else
label2:
Если условие еще проще, например:
if (x)
Язык C будет считать x
равным true , если он ненулевой, и false в противном случае.
Если условие содержит операторы ||
и / или &&
, компилятор сгенерирует код, который закроет тест. Другими словами, для выражения x != 0 && a/x == y
второй тест даже не будет выполнен, если первый тест неверен. В этом случае это используется для гарантии того, что деление на ноль не выполняется.