Причина, по которой "ненулевой" считается true , вероятно, связана с базовой архитектурой процессора. Большинство языков ассемблера реализуют условный поток управления с помощью кодов сравнения (на x86 используется инструкция cmp
, или другие инструкции неявно устанавливают флаг нуля), который устанавливает соответствующий «флаг нуля». Затем команды условного ветвления будут проверять нулевой флаг и переходить к новому местоположению, только если оно установлено.
Нулевой флаг устанавливается только, если значение равно нулю, поэтому он избегает дополнительной инструкции сравнения, чтобы проверить, является ли значение в точности равно единице.
Например, на машинах x86 это:
int fn(int x)
{
if(x) return 1;
else return 0;
}
станет (примерно так) следующим образом:
fn:
cmp edi, 0
jz .L2
mov eax, 1
ret
.L2:
mov eax, 0
ret
Предположим, ваш вопрос такое "почему C рассматривает ненулевые значения как истинные?" (в этом я не был полностью уверен), причина в том, что это самый эффективный способ использовать наборы инструкций, которые мы имеем на современном оборудовании (как говорится, приведенный выше пример не нужен и неэффективен, но просто для демонстрации точка).