CUESTIÓN

Cuando ejecuto un programa con la siguiente línea:
if (argc=!2 || atoi(argv[1])<0 || atoi(argv[2])<=0)
   {
    ...
    } 
en su función main, me sale una ventana indicando una violación de acceso a memoria cuando no meto dos argumentos por la línea de órdenes. ¿Por qué?


SOLUCIÓN

Hay errores de sintaxis que no son tales. En esta línea, en concreto, en el primer término de la condición del if, ha habido un error de mecanografía y se ha puesto argc=!2 en lugar de argc!=2 y el compilador no lo detecta, porque resulta una orden con sentido en C.

Cuando el compilador llega a argc=!2, toma el 2 y calcula !2. Como 2 es verdadero (distinto de cero), !2 es verdadero (o sea, cero). A continuación, hace argc=0, es decir, asigna cero a argc. Finalmente el resultado de una asignación en C, vista como función, es el número asignado, por lo que el primer término del if es cero (falso). A continuación, se evalúa el segundo término y al evaluar argv[1], se produce la infracción de acceso a memoria.
© 2000 Guillermo González Talaván.