Почему логические операторы в C не оценивают все выражение, когда в этом нет необходимости?

Я читал учебник для моего класса компьютерной архитектуры, и я наткнулся на это утверждение.

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

Мой вопрос: почему логические операторы в C ведут себя так? Используя авторский примерa && 5/a, C не нужно оценивать все выражение, потому что&& требует, чтобы оба предиката были истинными? Без потери общности мой же вопрос относится ко второму примеру.

Ответы на вопрос(5)

Ваш ответ на вопрос