33 votes

Point de déclaration en C++

Pourquoi la sortie n'est pas 101 alors que j'ai attribué le précédent x au nouveau x ?

int x = 101;
{
    int x = x;
    std::cout << x << std::endl;
}

Sortie (ordures) :

422634

Je pensais que le deuxième x serait initialisé à 101 mais il n'est pas initialisé.

Note : La solution dans ce cas est int x = ::x mais la question est pourquoi ça arrive.

45voto

M M. Points 29201

Point de déclaration

Le point de déclaration d'un nom se situe immédiatement après son déclarateur complet complet et avant son initialisateur... [C++ Standard § 3.3.2/1]

Le compilateur complète la déclaration lorsqu'il en sait assez sur le déclarant.

Le code ci-dessus est égal au code ci-dessous :

int x = 101;
{
  int x;
  x = x; <------------------// Self assignment, assigns an indeterminate value.
  std::cout << x << std::endl;
}

Car, la déclaration de l'intérieur x complété avant = (affectation)

int x = x; <--// Now, we have the new `x` which hides the older one, 
     ^        // so it assigns itself to itself
     |
     +---// Point of declaration,
         // here compiler knows everything to declare `x`.
         // then declares it.

D'autre part, lorsque nous déclarons des objets complexes, le point de déclaration est plus éloigné. Donc, le comportement est différent.

Par exemple, le code ci-dessous est correct

const int i = 2;
{
  int i[i];
         ^
         |
         +----// Point of declaration
              // compiler has to reach to "]"
              // therefore before declaring `i` as an array
              // there is just one `i`, the `i` of `const int i=2`
}

Dans le code ci-dessus, le compilateur doit connaître la taille réelle du tableau pour compléter la déclaration, donc le point de déclaration est ] . Par conséquent, le i sur [i] est l'extérieur i car la déclaration de l i de int i[... n'est pas encore terminé. Ainsi, il déclare un tableau avec 2 éléments ( int i[2]; ).

Cet exemple montre également le point de déclaration d'un énumérateur.

const int x = 12;
{
  enum { x = x };
               ^
               |
               +---// Point of declaration
                   // compiler has to reach to "}" then
                   // there is just one `x`, the `x` of `const int x=12`

}

L'énumérateur x est initialisé avec la valeur de la constante x à savoir 12 .

9voto

greego Points 99

Il y a un autre moyen de le faire.

#include <iostream>
int x = 101;
int main()
{
  int x = ::x;
  std::cout << x << std::endl;
  std::cin.get();
}

0voto

chuang wang Points 37

Portée de la variable Ce qui se trouve devant x sera écrasé. int x = x ; Ici, il y a deux processus. Un : int x ;(définir la variable x et allouer de la mémoire et spécifier la valeur initiale : x = 0) ; à ce moment, le front x sera caché. Deux : x = x ;(ne pas trouver la valeur x) ;

Désolé : mon anglais est très mauvais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X