2016-03-03 3 views
0

Comment la portée interagit-elle avec la déclaration, l'initialisation et l'affectation des variables? La définition de ces termes en fonction de ce que je l'ai appris jusqu'à présent est ci-dessous:Notions de base de programmation: déclaration de variable, intitialiation, affectation et étendue

  • Déclaration: États du type d'une variable, et son nom/identifiant. Les variables doivent avoir été déclarées avant d'être attribuées ou lues. Affectation: Renvoie la valeur existante d'une variable et la remplace par une nouvelle, l'ancienne valeur est rejetée à la fin de l'instruction d'affectation, de sorte que la valeur peut être incrémentée ou ajustée, par exemple: x = x + y; Initialisation: Nom utilisé pour la première affectation d'une variable, avant l'initialisation, une variable a une valeur par défaut, dans le cas des objets, ces objets ont une valeur nulle. L'initialisation peut être effectuée conjointement avec la déclaration. Portée: La "durée de vie" d'une variable, une variable est dans la portée jusqu'à la fin du bloc de code, à quel point la mémoire utilisée pour stocker cette variable est libérée. En effet, la variable est supprimée ou "tuée", lorsque le bloc de code se termine.

Ce que je ne sais pas, c'est comment la portée interagit avec la déclaration et l'affectation. Alors que la portée d'une variable semble être basée uniquement sur le bloc de code dans lequel elle est déclarée, je ne sais pas comment l'affectation interagit avec la portée. Par exemple:

public class exampleClass 
{ 
    public static void main(String[] args) // using java for example 
    { 
     int x = 5; // x is declared here, and initialised with a value of 5 
     for (int i = 0; i < 10; i++) // i is declared and initialised here 
     { 
     x = i; // x is assigned the value of i each iteration 
     } // i goes out of scope here 
    System.out.println(x); // the value of x is printed 
    } // x goes out of scope here 
} 

Dans cet exemple, x est déclarée et initialisés (disons-nous simplement initialisées?) Dans la principale méthode, et est dans la portée de cette méthode. Cependant, une valeur est affectée à x dans la boucle while. Ce qui sera imprimé quand ce code est exécuté, mais plus important encore pourquoi? Est-ce qu'il imprimera "5" ou "9"?

J'ai vu le code lever des exceptions de compilateur en raison de la syntaxe qui impliquerait que x devrait imprimer 5. Cependant quand je cours ce code d'exemple, j'obtiens "9". question

Une finale, pourquoi est-il que plusieurs variables peuvent être déclarées et en ligne initialisés:

int x = 1, y = 4, z = 6; 

Mais les variables ne peuvent pas être attribuées en ligne:

x = 1, y = 4, z = 6; 
+0

Essentiellement, cette question est plus sur les comment et pourquoi que les résultats. Je sais que la portée est basée sur où la variable a été déclarée, je ne sais pas pourquoi et comment, et travailler avec des choses que je ne comprends pas me dérange. En outre, si je sais que l'exemple me donnera "9", pas "5", si je ne le savais pas déjà, il serait impossible de le google pour le savoir, comme un exemple de la connaissance commune c'est rarement déclaré clairement sur des sites comme celui-ci, ce qui, ironiquement, le rend moins connu. –

+2

Plusieurs de ces questions sont susceptibles d'être spécifiques à la langue. Il n'y a pas un ensemble de règles universelles qui s'appliquent à toutes les langues. Donc, je suggère d'ajouter une balise de langue. –

Répondre

0

La distinction entre la déclaration et l'initialisation peut être flou; certaines langues établissent une distinction claire entre ces actions, dans d'autres, l'initialisation est une déclaration. Si une variable est initialisée alors qu'elle est déclarée, cela n'a pas d'importance.

Cependant, x est affecté d'une valeur dans la boucle while. Ce qui sera imprimé quand ce code est exécuté, mais plus important encore pourquoi? Est-ce qu'il imprimera "5" ou "9"? , Parce que c'est la dernière valeur qui lui a été assignée avant de l'imprimer. Portée: La "durée de vie" d'une variable, une variable est dans la portée jusqu'à la fin du bloc de code, à quel point la mémoire utilisée pour stocker cette variable est libérée.En effet, la variable est supprimée ou "tuée", lorsque le bloc de code se termine.

Oui et non. L'étendue définit dans quelles parties du code une variable particulière est disponible. Les différentes langues peuvent avoir des définitions très différentes de leurs règles de portée. Une variable est généralement collectée à la poubelle (dans les langues où cela s'applique) quand elle passe à hors de portée, lorsqu'aucun élément de code n'y a accès. Dans un bloc fonctionnel simple, cela se produit lorsque la fonction se termine.

Cependant, voir cet exemple Javascript:

function foo() { 
    var bar = 'baz'; 

    return function() { 
     alert(bar); 
    }; 
} 

La fonction intérieure qui est renvoyée par cette fonction tient encore une référence à bar. Même si foo se termine, bar est fermé sur par un closure et est toujours dans la portée de la fonction interne. Tant qu'une référence à cette fonction renvoyée existe, bar existe toujours.