Discussion:Introduction générale à la programmation/Variables et affectation
Remarque sur la notation employée
modifierIl serait plus judicieux d'écrire l'affectation comme x := 6, ou bien comme x← 6.
Cela permettrait de lever l'ambiguité avec le signe mathématique = .
Ainsi x=x+6 devient une expression booléenne valant FAUX;
alors que x := x + 6 ( ou x ← x+6 ) correspond à l'affectation de la valeur x+6 à la variable x.
confusion sémantique du '='
modifierJe suis absolument d'accord avec la remarque ci-dessus. À cause du mésusage de '=' pour l'affectation dans de nombreux langages, et malheureusement les plus employés, la notion d'affectation et aussi celle de variable (voir + loin) sont très mal comprises, y compris par les programmeurs. Ce chapitre de cours en est la parfaite illustration. Exemple tiré de cette page : Je pense que les lignes suivantes entretiennent une confusion courante
- L'affectation
- L'instruction d'affectation de valeur est ici representée par le symbole =. Beaucoup de langages utilisent ce symbole comme instruction d'affectation, mais notons au passage que dans d'autres langages, comme le Langage Pascal par exemple, ont choisi le symbole := comme instruction d'affectation. L'égalité n’est pas symétrique : nous aurons toujours l'affectation sous la forme
- variable = expression;
Il est clair que l'auteur ne distingue (dans le texte en tout cas) l'affectation de l'égalité, ce qui revient quand même à confondre une instruction (action) avec une expression logique. C’est courant et même plus ou moins 'légal' en C.
Conclusion: dans un cours d’introduction à la programmation, évitons comme la peste les caractéristiques trompeuses (misleading) de particularismes de l'implémentation du C, même si la famille C++/java/pyton les reprend en partie; et surtout évitons sa (pédagogiquement désastreuse) syntaxe!
Je proposerais d’utiliser tout simplement ':' pour l'assignment. C’est clair, simple, parlant. C’est courant comme syntaxe de relation nom:valeur, y compris hors programmation. Ca veut dire ce que ça veut et ça trompe pas. Sinon, le ':=' de Pascal est pas mal -- mais pourquoi s'encombrer du '=' en plus du ':'?
En ce qui concerne la flèche, il y a une ambiguïté sur le 'sens' : est-ce le nom qui est affecté à la valeur, ou l'inverse. Comme les 2 interprétation sont valables, il faudrait une double flèche. Ce qui traduit bien l’idée d'une association entre un ID et une donnée ; le signe ':' ne représente-t-il pas cette idée plus simplement ?
En tout cas, il est nécessaire de réserver le '=' là où il est juste, c'est-à-dire l'operateur d'égalité : 'a=b' est une proposition logique qui peut être vraie ou fausse
petit problème d'affectations entres amis :
modifierpour le code :
a = 1;
x = 2;
a = x * ++a;
quelle sera en C/C++ la valeur de "a" ?
réponse : aucune norme ne le définit cela peut être :
2 * 2;
comme:
2 * 1;
cf: effet de bord en C/C++
une variable, c’est quoi ?
modifierLa page affirme:
- Les variables en programmation ont la même vocation que les variables en mathématiques : symboliser une valeur pouvant changer au cours du temps, et y faire référence par un nom choisi.
C'est à mon avis aussi faux en mathématiques qu'en programmation. Les variables ont divers usages dans ces deux contextes, mais pas celui-là. Du moins pas à la base. Voir l'article 'variable' de wikipedia à ce sujet. Voici ce que je comprends de cette notion:
Un programme peut exprimer la solution d’un problème, une méthode d'action, le modèle d’un système... soit dans un cas spécifique, soit d'une manière générale. Pour caricaturer : on peut soit afficher "salut, Jean", soit demander le nom de l’utilisateur puis afficher "salut, " + nom_utilisateur + "!". nom_utilisateur est alors le nom d'une variable. Et il ne changera pas.
La variable est une chose qui permet d'écrire une programme valable pour tout un ensemble de cas possibles, typiquement un ensemble quasiment infini, comme ci-dessus le nombre de noms d’utilisateur possibles. La solution, la méthode ou le modèle deviennent généraux. C’est ce qui le distingue d'une 'recette', bien qu'une recette de cuisine puisse devenir plus générale si les quantités sont indiquées par personne, le nombre de personnes devenant alors une variable.
La notion de variable, malgré son nom un peu trompeur, n'a ainsi rien à voir avec le changement, la modification de valeur. Ce qui est variable, c’est la valeur qu'elle prend à chaque 'instanciation : à chaque application d'une formule en maths, par exemple, ou à chaque exécution d’un programme. La variable est une donnée dont la valeur effective n’est pas connue à l'écriture, elle peut prendre n’importe laquelle d’un ensemble de valeurs valides : un ensemble de définiton en maths, parfois un type en programmation. C’est ça qui la distingue d'une constante. Ci-dessus, "Jean" est une constante, on connait sa valeur au moment de l'écriture, on aurait pu la stocker avec un nom de constante.
En computer science on distingue souvent la compilation (compile time) de l'exécution (runtime), mais pour programmeur il s'agit plutôt de distinguer les moments d'écriture et d'exécution. Une donnée ou valeur qui n’est pas connue à l'écriture est représentée par une variable qui confère au programme une valeur générale. Le nom de la variable prend dans le code une place (cf. placeholder) qui sera à l'exécution affectée à une valeur effective. Ce sont les données d'entrée du programme qui vont permettre d'associer les noms de variable à des valeurs : les variables sont ainsi en quelque sorte les paramètres du programme. On peut faire l'analogie avec les paramètres (ou arguments) d'une fonction. À ceci près que les variables ne généralement pas affectées au lancement du programme, mais plutôt durant l'exécution ; au contraire des paramètres qui sont eux passés à l'appel d'une fonction.
J'insiste sur le fait que la notion variable n'inclut pas la modification. Regardez dans vos programmes si toutes vos variables sont modifiées. Non seulement ce n’est pas le cas, mais seule une infime minorité sont affectées plus d'une fois. Parfois des réaffectations sont en fait des changements d'objets, et il vaudrait changer de nom, pour la clarté. Certains langages ne permettent même pas de réaffecter une variable. La modification est parfois utile mais, d’un certain point de vue, elle n’est pas nécessaire.
J'en profite pour contester une autre affirmation courante et trompeuse : les variables ne sont pas non plus des 'boites' -- et surtout pas des 'cases-mémoire'.