2010-09-16 3 views
0

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

+3

Vous devriez clarifier votre question et peut-être montrer un exemple des deux cas que vous êtes se référant à. –

Répondre

2

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 ...)

2

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.

3

Le code source sera difficile à comprendre, c'est le problème, mais c'est légal.

4

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.

1

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