Saltar al contenido

¿Por qué el compilador no informa que falta un punto y coma?

Posterior a observar en diversos repositorios y sitios webs de internet al final dimos con la resolución que te compartiremos a continuación.

Solución:

C es un forma libre idioma. Eso significa que puede formatearlo de muchas maneras y seguirá siendo un programa legal.

Por ejemplo, una declaración como

a = b * c;

podría escribirse como

a=b*c;

o me gusta

a
=
b
*
c
;

Entonces, cuando el compilador vea las líneas

temp = *a
*a = *b;

cree que significa

temp = *a * a = *b;

Por supuesto, esa no es una expresión válida y el compilador se quejará de eso en lugar del punto y coma que falta. La razón por la que no es válida es porque a es un puntero a una estructura, por lo que *a * a está intentando multiplicar una instancia de estructura (*a) con un puntero a una estructura (a).

Si bien el compilador no puede detectar el punto y coma que falta, también informa el error totalmente no relacionado en la línea incorrecta. Es importante notar esto porque no importa cuánto mire la línea donde se informa el error, no hay ningún error allí. A veces, problemas como este necesitarán que mires anterior líneas para ver si están bien y sin errores.

A veces, incluso tiene que buscar en otro archivo para encontrar el error. Por ejemplo, si un archivo de encabezado está definiendo una estructura lo último que lo hace en el archivo de encabezado y falta el punto y coma que termina la estructura, entonces el error no estará en el archivo de encabezado sino en el archivo que incluye el archivo de encabezado.

Y a veces las cosas empeoran aún más: si incluye dos (o más) archivos de encabezado y el primero contiene una declaración incompleta, lo más probable es que el error de sintaxis se indique en el segundo archivo de encabezado.


Relacionado con esto está el concepto de hacer un seguimiento errores. Algunos errores, normalmente debido a que faltan puntos y comas, se informan como múltiple errores. Por eso es importante comenzar desde arriba al corregir errores, ya que corregir el primer error puede hacer que desaparezcan varios errores.

Por supuesto, esto puede llevar a corregir un error a la vez y a recompilaciones frecuentes que pueden resultar engorrosas con proyectos grandes. Sin embargo, reconocer tales errores de seguimiento es algo que viene con la experiencia, y después de verlos varias veces es más fácil desenterrar los errores reales y corregir más de un error por recompilación.

¿Por qué el compilador no detecta el punto y coma que falta?

Hay tres cosas que recordar.

  1. Los finales de línea en C son espacios en blanco ordinarios.
  2. * en C puede ser un operador unario y binario. Como operador unario significa “desreferencia”, como operador binario significa “multiplicar”.
  3. La diferencia entre operadores unarios y binarios se determina a partir del contexto en el que se ven.

El resultado de estos dos hechos es cuando analizamos.

 temp = *a    /* Oops, missing a semicolon here... */
 *a = *b;

El primero y el ultimo * se interpretan como unarios pero el segundo * se interpreta como binario. Desde una perspectiva de sintaxis, esto parece correcto.

Solo después de analizar cuando el compilador intenta interpretar los operadores en el contexto de sus tipos de operandos, se ve un error.

Algunas buenas respuestas arriba, pero las detallaré.

temp = *a *a = *b;

Este es en realidad un caso de x = y = z; donde ambos x y y se les asigna el valor de z.

Lo que estas diciendo es the contents of address (a times a) become equal to the contents of b, as does temp.

En breve, *a *a = es una declaración válida. Como se señaló anteriormente, la primera * desreferencia un puntero, mientras que el segundo multiplica dos valores.

Si crees que ha resultado provechoso nuestro artículo, sería de mucha ayuda si lo compartes con más desarrolladores de esta manera nos ayudas a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *