Como otras respuestas han explicado, la respuesta básica es que cualquier expresión que se evalúe a 0 se interpreta como una condición 'falsa' en C o C++, y *s
evaluará a 0 cuando el puntero s
alcanza el carácter de terminación nula de la cadena ('\ 0').
Puede utilizar de forma equivalente la expresión *s != 0
, y algunos desarrolladores pueden argumentar que esto es lo que se debe utilizar, dando la opinión de que la expresión 'más completa' es más clara. Esté o no de acuerdo con esa opinión, debe ser capaz de comprender el uso de la alternativa definitiva, ya que se usa con mucha frecuencia en el código C/C++. Te encontrarás con estas expresiones mucho, incluso si prefieres usar la comparación más explícita.
La explicación más rigurosa del estándar (por alguna razón me siento obligado a incluir esto en la discusión, aunque en realidad no cambia ni aclara nada. De hecho, probablemente confundirá las cosas innecesariamente para algunas personas - si no te importa entrar en este nivel de trivia, no te perderás absolutamente nada al hacer clic en el botón Atrás ahora mismo ...):
En C, la expresión *s
está en lo que el estándar llama 'expresión' -2 'de la declaración for
, y este ejemplo de instrucción particular for
solo está aprovechando la definición del estándar de la declaración for
. La declaración for
se clasifica como una 'declaración de iteración', y entre la semántica de cualquier declaración iteración son (6.8.5/4 "declaraciones de iteración"):
Una declaración iteración hace que una declaración llama el cuerpo del ciclo de ser ejecutado repetidamente hasta que la expresión de control compara igual a 0.
Puesto que la 'expresión-2' parte de la declaración for
es la expresión de control, esto significa que el bucle for
ejecutará repetidamente hasta *s
compara igual a 0.
El estándar C++ define las cosas un poco diferente (pero con el mismo resultado). En C++, la declaración for
se define en términos de la declaración while
, y la parte de condición de la declaración while
controla el la iteración (6.5.1/1 "La declaración mientras que"):
hasta que el valor de la condición se convierte false
Anteriormente en el estándar de C++, lo siguiente describe cómo las expresiones se convierten en bool
(4,12 "conversiones booleanos"):
Un valor de aritmética, enumeración, puntero o puntero al tipo de miembro se puede convertir a un valor r de tipo bool. Un valor cero, un valor de puntero nulo o un valor de puntero de miembro nulo se convierte en falso; cualquier otro valor se convierte en verdadero
Las palabras similares en el estándar (en ambos idiomas) se aplican a la expresión/condición de control de todas las declaraciones de selección o de iteración. Todo este lenguaje-lawyerese se reduce al hecho de que si una expresión evalúa a 0 es lo mismo que evaluar a falso (en el sentido inglés de la palabra, ya que C no tiene una palabra clave false
incorporada).
Y esa es la larga y confusa explicación del concepto simple.
Parece un algoritmo hash. –