El for no tiene cuerpo, todas las comprobaciones se hacen en la condicion de continuidad. (Date cuenta de que nada mas terminar la declaracion del for, hay un punto y coma, por lo tanto el valor se le asigna a ord al salir del for)
Cualquier cadena termina en cero, y cero en C significa falso y distinto de cero verdadero. Por lo tanto
Código
significa que for se ejecutara mientras las dos cadenas tengan un caracter, o lo que es lo mismo, que el for finalizara cuando se acabe una de las dos cadenas (o las dos).
nom1[k] && nom2[k]
La siguiente condicion te dice que el for continuara mientras las letras de la posicion actual sean iguales.
Es decir, de todas todas se saldra del for si alguna de las cadenas ha terminado o si el caracter de la posicion i es distinto.
(cambio la i por la k para que no me salga en cursiva)
Caso1: nom1 ha terminado
En este caso, nom1[k] == 0, por lo tanto si la segunda cadena es mas larga, 0 - letra (no simbolo, sino letra) sera menor que cero. Y si la segunda cadena tambien ha terminado, las dos seran iguales:
Hola
Holaa
o sino
Hola
Hola
(compruebalo mirando las condiciones del for con lapiz y papel)
Caso2: nom2 ha terminado
Si se da este caso, nom1 no habra terminado (estudia sobre la evaluacion del y logico), pero nom2 si, por lo tando nom1[k]!=0 y nom2[k] == 0, suponiendo que nom1[k] es una letra del alfabeto, se tiene que nom1[k] > 0 y nom2[k] == 0. Es decir, nom1[k] - nom2[k] > 0, lo cual tiene su logica, ya que todas las letras de nom1 seran iguales a las de nom2 mientras no se termine nom2, pero nom1 sera mas larga:
Holaa
Hola
(como antes, comprueba con lapiz y papel que efectivamente es asi)
Caso3: nom1[k] != nom2[k]
Ahora no ha terminado ni nom1, ni nom2 y se ha encontrado una letra diferente en las cadenas. Por lo tanto nom1[k] - nom2[k] sera menor o mayor que cero, segun nom1[k] sea menoro o mayor alfabeticamente que nom2[k].
(como siempre, compruebalo con lapiz y papel)
¡Saludos!