¿Por qué los operadores lógicos en C no evalúan la expresión completa cuando no es necesario?
Estaba leyendo mi libro de texto para mi clase de arquitectura de computadoras y me encontré con esta declaración.
Una segunda distinción importante entre los operadores lógicos&&
'y'||
'frente a sus contrapartes de nivel de bits'&
'y'|
'es que los operadores lógicos no evalúan su segundo argumento si el resultado de la expresión puede determinarse evaluando el primer argumento. Así, por ejemplo, la expresióna && 5/a
nunca causará una división por cero, y la expresiónp && *p++
nunca provocará la desreferenciación de un puntero nulo. (Computer Systems: A Programmer's Perspective por Bryant y O'Hallaron, 3ra edición, p. 57)
Mi pregunta es ¿por qué los operadores lógicos en C se comportan así? Usando el ejemplo del autor dea && 5/a
, no necesitaría C evaluar la expresión completa porque&&
requiere que ambos predicados sean verdaderos? Sin pérdida de generalidad, mi misma pregunta se aplica a su segundo ejemplo.