¿Por qué esto no da error de compilación? [duplicate]

3 minutos de lectura
int a = a ;  

De acuerdo con la regla del operador de asignación, debe leer la línea de derecha a izquierda. Después de ver ‘un’ compilador no declarado, debería dar un error de compilación.
Pero it is giving garbage value . Por favor aclararlo.

  • ¿No permitiría realmente a para ser declarado – con basura – y luego presumiblemente imprimir esa basura? También según su lógica, no se podría asignar nada en una declaración. int a = 1; fallaría porque la asignación “se lee de derecha a izquierda” y por lo tanto a no está declarado; ¿no?

    – Jefe Dos Lápices

    12 de julio de 2013 a las 5:24


  • es el mismo valor basura que estaba en a para empezar ya que nunca inicializaste a.

    – dandan78

    12 de julio de 2013 a las 5:25

  • posible duplicado de Is autoinicialización ‘A a = a;’ ¿permitió? También aquí: stackoverflow.com/questions/3173462/int-var-1-void-main-int-ii

    – jogojapan

    12 de julio de 2013 a las 5:26


  • @jagojapan: bueno, mi pregunta es por qué esto no da un error de compilación. Dado que ‘a’ no está declarado en el momento de la asignación, pero aún no ha sido respondido 🙁

    – rforritz

    12 de julio de 2013 a las 5:43


  • @rforritz Creo que te gusta leer esta breve nota: Punto de Declaración para entender por qué el compilador no da error.

    –Grijesh Chauhan

    12 de julio de 2013 a las 5:51


§3.3.2/1:

El punto de declaración de un nombre es inmediatamente después de su declarador completo (Cláusula 8) y antes de su inicializador (si lo hay), excepto como se indica a continuación. [ Example:

int x = 12;
{ int x = x; }

Here the second x is initialized with its own (indeterminate) value. —end example ]

  • Tenga en cuenta que en el último borrador de C++1y esto ha cambiado.

    – Shafik Yaghmour

    5 de mayo de 2014 a las 2:53

avatar de usuario
akalenuk

En realidad, el compilador podría darte una pista. El mío dice: “advertencia C4700: variable local ‘a’ utilizada sin haber sido inicializada”.

Pero esto no es un error per se, la declaración solo da un nombre de variable a algunos bits de memoria sin tocarlos, lo cual es válido y rápido. Y la asignación aquí no es realmente una asignación, solo mover bits de derecha a izquierda. No hay cheques de nuevo. Muy productivo, muy inseguro.

Toda operación es legal, pero todo es inútil. Entonces, el compilador hace lo mejor que puede: compila el código, pero también da una advertencia.

  • La inicialización no “simplemente da un nombre de variable a algunos bits de memoria sin tocarlos”. Declaración hace eso. La inicialización es el paso en el que proporciona un valor inicial a ese bit de memoria con nombre.

    – Este no es mi verdadero nombre

    12 de julio de 2013 a las 17:24

  • Sí exactamente. Pero en este caso básicamente no hay inicialización. Lo que parece ser uno es solo una declaración y asignación.

    – akalenuk

    12 de julio de 2013 a las 21:17

  • Oh, probablemente debería editar mi respuesta para evitar confusiones. ¡Gracias!

    – akalenuk

    12 de julio de 2013 a las 21:20

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad