Por que os operadores lógicos em C não avaliam toda a expressão quando não é necessário?
Eu estava lendo meu livro para minha aula de arquitetura de computadores e me deparei com essa afirmação.
Uma segunda distinção importante entre a lógica dos operadores&&
'e'||
'versus seus equivalentes em nível de bit'&
'e'|
'é que os operadores lógicos não avaliam seu segundo argumento se o resultado da expressão puder ser determinado pela avaliação do primeiro argumento. Assim, por exemplo, a expressãoa && 5/a
nunca causará uma divisão por zero, e a expressãop && *p++
nunca causará a desreferenciação de um ponteiro nulo. (Computer Systems: A Programmer's Perspective por Bryant e O'Hallaron, 3a edição, p. 57)
Minha pergunta é por que os operadores lógicos em C se comportam assim? Usando o exemplo do autor dea && 5/a
, C não precisaria avaliar toda a expressão porque&&
requer que ambos os predicados sejam verdadeiros? Sem perda de generalidade, minha mesma pergunta se aplica ao seu segundo exemplo.