DOUG LLOYD: Comme vous commencez avec des fonctions de travail,
une autre chose va devenir vraiment important de comprendre,
qui est le concept de la portée des variables.
Donc, est un champ caractéristique d'une variable
qui définit à partir de laquelle les fonctions cette variable peut être consulté.
>> Il ya deux champs primaires dans C, les variables locales et les variables globales.
Maintenant, les variables locales ne peut accéder dans les fonctions
dans laquelle ils sont créés.
Ils ne peuvent pas être consultés par tous les autres fonction qui existe dans votre programme,
seule la fonction en dont il a été créé.
Les variables globales, sur le d'autre part, peut être consultée
par une fonction dans le programme.
Et la raison en est que parce qu'ils ne sont pas créés à l'intérieur
d'une fonction particulière.
Nous les déclarons à l'extérieur de toutes les fonctions qui,
signifie que chaque fonction sait où il est et peut accéder et les manipuler.
>> Jusqu'à présent, dans le cours que vous avez à peu beaucoup travaillé exclusivement
avec des variables locales.
Voici un exemple d'une très, très fonction principale simple et très simple
fonction supplémentaire que nous avons écrit.
Dans ce cas, X, Je l'ai juste de couleur verte
pour mettre en évidence la localité ou la portée de cette variable,
est locale à la triple fonction.
principal ne peut pas se référer à x du tout.
Il ne sait pas ce qu'il est.
Aucune autre fonction, en fait, si nous eu des fonctions supplémentaires ici,
pourrait se référer à x.
>> De même, les résultats que je l'ai de couleur bleue, est local uniquement pour principale.
Seulement principale sait ce le résultat variable est.
triple ne peut pas l'utiliser.
>> Maintenant, comme je l'ai mentionné, variables globales existent.
Si vous déclarez cette variable en dehors de toute fonction,
toutes les fonctions de la programme peut s'y référer.
Donc, dans ce cas, je l'ai souligné dans vert une déclaration de variable globale.
Dans ce cas, la être variable déclarée
est appelé globale, juste pour être extrêmement clair à ce sujet.
Il est de type float.
Et je lui attribuer la valeur 0,5050.
>> Vous remarquerez que dans le principal et triple, je suis en mesure de se référer au niveau mondial.
Et en fait, si je vais à travers le programme comme indiqué, principales premiers appels triple,
multiplie par 3 triples mondiaux, qui définit sa valeur à 1,5-quelque chose,
1,51 ou quelque chose comme ça, et puis principale imprime également la valeur
de la planète.
Donc principale ne sera pas imprimer 0,5050 il, va imprimer 3 fois mondiaux, 1,51.
Donc, vous avez à être prudent lorsque vous travaillez avec des variables globales.
Alors qu'ils sont très flexibles dans être en mesure de transmettre des informations
autour de sorte que tous les fonction peut utiliser,
il peut aussi avoir une certaine conséquences dangereuses
si une modification de fonction la valeur d'une variable
avant que vous attendez qu'il soit changé.
>> Pourquoi cette distinction ne importe?
Pourquoi avons-nous soucions si certaines variables sont locales et d'autres sont de la planète?
Eh bien, pour la plupart, des variables locales en C sont ce qu'on appelle passé par valeur
quand nous faisons un appel de fonction.
Qu'est-ce que cela veut dire?
>> Eh bien, quand une variable est passée en valeur, l'appelé, qui
est une autre façon de dire la fonction qui reçoit le variable
obtient passé comme une entrée, il fait ne reçoit pas cette variable elle-même.
Il reçoit son propre copie à travailler avec.
Cette distinction est vraiment important.
Nous venons de voir il ya une seconde que, avec les variables globales,
si nous manipulons mondial variable dans une fonction, l'effet
en ce qu 'une fonction porte grâce à toute autre fonction.
>> Mais avec les variables locales, ce n'est pas vrai.
Chaque fonction quand il reçoit comme variables d'entrée
recevoir des copies de ces variables, les variables non eux-mêmes.
Alors, quel est l'effet secondaire de cela?
Cela signifie que la variable dans l'appelant, la fonction qui
est prise de l'appel de fonction, est inchangée, sauf si vous la remplacez.
>> Par exemple, dans le code foo n'a pas changé du tout.
Int foo est égal à 4, triple appel de foo, à l'intérieur du triple,
nous nous attendrions à ce que foo être multipliée par 3 et retourné,
mais il ya en fait aucun effet.
>> Ici cependant, une différence très subtile.
Cela ne l'effet que nous voulons.
Voyez-vous pourquoi?
Nous impérieuses foo dans le principal cette fois.
>> Donc foo int égal à 4, foo égal triple foo, quand nous faisons cet appel,
triple obtient sa propre copie de foo, sa propre copie de 4.
Il dit revenir 4 fois 3, ou quoi la variable est transmis dans les temps 3.
Et puis nous assignons le retour valeur du triple Foo nouveau.
Donc, ce serait effectivement remplacer foo.
Ceci est la seule façon de le faire avec cette variable locale.
Alors maintenant, si nous ajoutons un autre ligne de code ici
à la fin de principal à imprimer la valeur de foo,
il serait en fait imprimer 12.
>> La portée des variables est généralement pas trop d'un problème
si vous nommez tous vos les variables des choses différentes.
Mais il peut devenir peu sale si le même nom de variable
apparaît dans de multiples fonctions, ce qui va se passer beaucoup de choses.
Si jamais vous ne travaillez dans le monde réel où
vous travaillez sur la collaboration des programmes et des personnes dans différentes équipes
travaillent ensemble pour écrire la même programme ou le même ensemble de programmes,
ils vont souvent réutiliser variables noms, ceux particulièrement communs
comme x, y, i, j, et ainsi de suite.
>> Mais lorsque les variables ont le même nom, les questions de portée
peut obtenir un peu plus délicat à analyser.
Par exemple, savez-vous ce qui serait imprimée
à la fin de ce programme particulier?
Prenez une minute.
Mettre en pause la vidéo et lire grâce à ce programme.
Vous pouvez voir au top nous avoir une déclaration de fonction
pour une fonction appelée incrément.
Cette fonction prend un seul paramètre, un nombre entier que nous appelons x.
Et il affiche un nombre entier.
Voilà le type de retour au début.
>> Ensuite, nous avons principale, un couple de lignes de code dans principal, dont la dernière
est une déclaration d'impression.
Et rappelez-vous, telle est la question ici.
Qu'est-ce qui se passe réellement à être imprimé à la fin de cette fonction?
Et puis nous avons fait le définition d'incrément ci-dessous.
>> Alors, prenez une minute, grâce à l'étape le code, trace les choses.
Savez-vous ce qui va être imprimé à la fin de ce programme particulier?
>> Bien.
Heureusement, vous avez pris quelques secondes pour essayer et analyser celui-ci dehors.
Faisons le ensemble.
>> Donc, je l'ai biffé incrément de déclaration au sommet il.
Il était une sorte de distraction.
Il est pas sa propre variable.
Il ne possède pas son propre champ.
Il est juste une fonction déclaration, donc à des fins
d'essayer d'analyser ce qui est passe dans ce programme,
nous pourrions tout aussi bien l'éviter.
>> Maintenant que nous avons dans ce cas, le la raison de ce problème est délicat
parce que nous avons des variables locales dans à la fois principal et incrément, dont chacun
est appelé x.
Et bien sûr, le point crucial de cette question est essayer de Suss où x est changé
et comment est-elle changée.
Donc, je l'ai colorié tous les cas de x qui est locale au rouge principale.
Et je l'ai colorié tous les cas de x qui est local pour incrémenter bleu.
>> Avis dans cette troisième ligne du principal, y est égal à incrément
x, cet incrément est de ne pas x passé de principal ou le x rouge.
Ça se passait une copie de celui-ci.
Et il va seulement de travailler avec cette copie de celui-ci, le X bleu.
Si vous êtes mathématiquement inclinée, vous pourriez
ont plutôt pensé à ce que sous x m pour principale et secondaire x i pour incrément.
Mais il est la même idée.
x sous m, ou un X rouge dans la diapositive précédente,
sont les variables qui sont local-- est l'instance de x plutôt que
est local principal et sous x i, ou les variables bleues dans la diapositive précédente,
sont les instances de x que sont locale pour incrémenter.
>> Donc, vous étiez en mesure de comprendre ce qui cette fonction imprimé à la fin?
Je suis Doug Lloyd, et ceci est CS50.