Почему логические операторы в C не оценивают все выражение, когда в этом нет необходимости?
Я читал учебник для моего класса компьютерной архитектуры, и я наткнулся на это утверждение.
Второе важное различие между логическими операторами&&
' а также '||
«по сравнению с их битовыми уровнями»&
' а также '|
заключается в том, что логические операторы не оценивают свой второй аргумент, если результат выражения может быть определен путем вычисления первого аргумента. Так, например, выражениеa && 5/a
никогда не вызовет деление на ноль, а выражениеp && *p++
никогда не вызовет разыменование нулевого указателя. (Компьютерные системы: взгляд программиста, Брайант и О'Халларон, 3-е издание, стр. 57)
Мой вопрос: почему логические операторы в C ведут себя так? Используя авторский примерa && 5/a
, C не нужно оценивать все выражение, потому что&&
требует, чтобы оба предиката были истинными? Без потери общности мой же вопрос относится ко второму примеру.