Peut-on déclarer une variable à la fois l'intérieur et le bloc externe de mon programme? Pourquoi est-il appelé une mauvaise pratique si programatically il ne crée pas de problème ..Variables en C
Répondre
Vous pouvez déclarer des variables dans des fonctions (variables locales) ou des fonctions externes (variables globales). Vous devriez généralement minimiser la portée d'une variable, car cela facilite la compréhension du code. Par exemple, si vous modifiez la valeur d'une variable globale dans une fonction et appelez une autre fonction qui, pour des raisons non apparentées, modifie également cette variable, le code résultant peut faire des choses que vous n'êtes pas attendre et que quelqu'un lisant votre code ne serait pas attendre (et encore moins si vous deviez essayer alors paralléliser ce code ...)
becouse vous masquez une variable dans une portée - et c'est un bon moyen de faire des erreurs. Dans les petits programmes, vous pouvez vous rappeler quelle variable est globale/locale, mais pas plus compliquée.
Le code source sera difficile à comprendre, c'est le problème, mais c'est légal.
en C, les variables sont scope lexicalement, ce qui signifie que, à un moment donné dans votre code, le compilateur sait quelle variable réelle est référencée par un nom donné. Le problème est que si vous avez deux variables nommées foo
, (a) vous pourriez ne pas souvenez-vous qui est qui, et (b) vous ne pouvez pas se référer à la foo
externe lorsque vous êtes dans les foo
internes « s portée.
En particulier:
void MyFunction()
{
int foo = 1;
printf("%d", foo); // prints "1"
// create a new scope...
if (whatever)
{
int foo = 2;
printf("%d", foo); // prints "2"
foo = 3;
printf("%d", foo); // prints "3"
}
printf("%d", foo); // prints "1"
}
Maintenant, imaginez que le bloc whatever
était long et compliqué ... quand vous arrivez à foo = 3
, disons que la partie supérieure du bloc est pas à l'écran, mais vous savez que MyFunction
a une variable à l'échelle de la fonction nommée foo
. Le seul problème est que vous avez tort, vous définissez uniquement la valeur de la "interne" foo
. Du point de vue du compilateur, c'est évident ... parce que le foo
intérieur cache complètement l'extérieur. C'est pourquoi c'est considéré comme une mauvaise pratique.
Vous souhaiterez peut-être lire http://en.wikipedia.org/wiki/Scope_(programming) pour en savoir plus sur la portée lexicale.
Ce qu'on appelle variable shadowing, elle a ses avantages pour les petites choses comme les constructeurs, mais à long terme, il peut conduire à des problèmes:
-
Code
- est ambigous et donc difficile à lire et à comprendre
- la mauvaise variable peut être utilisée sans le vouloir, ce qui conduit à difficile à repérer les bugs
- confusion peut survenir lorsque votre travail avec votre propre code
fond lin e: oui vous pouvez le faire, mais évitez-le autant que possible, surtout dans les grands projets, car vous finirez probablement par être poignardé: P
- 1. Variables d'état en C#
- 2. variables globales en C++
- 3. noms de variables en C
- 4. Variables de référence en C++
- 5. Variables statiques en C et C++
- 6. variables simples en Java et C++
- 7. Maintien des variables en mémoire, C++
- 8. Variables globales ou équivalentes en C#
- 9. Listes d'arguments variables en C++/CLI
- 10. Temps intermédiaire pour deux variables en C#
- 11. accès aux variables simultanées en c
- 12. Modifier les variables globales en C++
- 13. Problème avec les variables locales en C#
- 14. les variables Net-SNMP en C++
- 15. variables de membre mutables statiques en C++?
- 16. variables-variables en PHP
- 17. c étendue de variables
- 18. C++ portée des variables
- 19. Variables statiques C++ dynamiques
- 20. C++ redéfinition variables
- 21. Variables globales dans C
- 22. Où en mémoire sont les variables stockées en C++?
- 23. Variables globales dans l'objectif C
- 24. Desktop Application C# variables globales
- 25. Variables globales partagées dans C
- 26. citations c et les variables
- 27. C++: Variables non initialisées garbage
- 28. C: Global, variables statiques compréhension
- 29. C# variables passantes dans System.web.services.WebMethod
- 30. variables de classe Python ou variables de classe en général
Vous devriez clarifier votre question et peut-être montrer un exemple des deux cas que vous êtes se référant à. –