Il existe un argument commun à propos de l'initialisation de plusieurs variables dans une seule ligne, c'est-à-dire:
Considérons par exemple int i, j = 1; ce qui pourrait amener certaines personnes à croire à tort que les deux variables sont initialisées
Nous pourrions affirmer que quelqu'un devrait connaître suffisamment la syntaxe de son langage pour ne pas s'y tromper. Un autre argument pourrait être que les développeurs apprennent tellement de langues que nous pouvons faire des erreurs entre les spécificités entre les langues.
Cependant, pour ce cas très spécifique, je me demande ce qui suit: existe-t-il même un langage où la syntaxe même i, j = 1 initialise les deux variables?
Sinon, cet argument ne s'applique pas.
programming-languages
syntax
Walfrat
la source
la source
Dim Apple, Orange, Pear as Fruit
est une déclaration légale. Supposons que vous ne connaissiez pas VB. Votre première impressionApple
est-elle de typeFruit
? Ce n'est pas. N'oubliez pas que les langues sont souvent lues par des personnes qui ne sont pas des experts dans cette langue; si vous êtes un expert, utilisez le langage à bon escient pour communiquer clairement vos intentions même aux non-experts. Je n'utilise jamais plusieurs initialisations dans n'importe quelle langue.var x = 1, y = 1.5;
Est-ce la même chose queint x = 1; double y = 1.5;
ou est-ce la même chose quedouble x = 1, y = 1.5;
? Lorsque nous avons ajoutévar
C # 3.0, j'ai fait un sondage et j'ai découvert qu'environ la moitié des gens pensaient que le premier était "évidemment" correct et que l'autre moitié pensait que l'autre était "évidemment" correct, et nous l'avons donc rendu illégal. Une caractéristique qui induit en erreur la moitié de la population est une mauvaise caractéristique.Réponses:
Je ne pense pas, mais ce n'est pas le but. Le fait est qu'il
i, j = 0
est très facilement confondu aveci = j = 0
, ce qui initialise les deux. La clarté est l'exigence la plus importante sur le code source à côté de l'exactitude, et le fait que cette question se pose même prouve que la clarté n'est pas optimale.la source
int i, j=1
par rapport àint i; int j = 1
(ou mieux encore, des lignes séparées)?"Je pense que vous pouvez plaider pour chaque côté:
Kontra
i, j = 0
: Lesmathématiciens utilisent cela pour signifier que les deux
i
etj
sont censés être nuls.Pro
i, j = 0
:C'est une simple question de connaître la priorité de vos opérateurs. Et si vous doutez de leur priorité, il est maintenant temps de la rechercher.
C'est la même raison pour laquelle nous écrivons des trucs comme
a.b += c[i]*d[i];
sans les parenthèses. Bien sûr, cela équivaut à(a.b) += ((c[i])*(d[i]));
, mais on peut s'attendre à ce que les programmeurs connaissent par cœur la priorité des opérateurs les plus utilisés et puissent rechercher la priorité des opérateurs lorsqu'ils ne sont pas sûrs. Ainsi, les parenthèses sont généralement considérées comme un encombrement inutile à moins qu'elles ne forcent un ordre d'évaluation différent de celui que la priorité de l'opérateur prescrirait.Bien sûr, il y a des exceptions. La priorité de
<<
et+
est généralement considérée comme suffisamment ambiguë pour garantir des parenthèses dans les deux cas. Mais c'est l'exception qui confirme la règle.Pour ma part, je tomberais plus du côté Pro, mais je suis prêt à m'en tenir à tout guide de style qui interdit de telles déclarations. Ce n'est pas une question qui mérite d'être combattue.
la source
int i, j = 0;
n'y a aucun opérateur dedans. La seule expression dans cette instruction est0
et donc la priorité des opérateurs n'y entre pas. L'analyseur syntaxique ne traite pas,
comme l'opérateur de virgule ou=
comme l'opérateur d'affectation; ce sont plutôt des parties grammaticales de la déclaration.but programmers can be expected to know the precedence of the most used operators by heart
, vous dites. Dans l'exemple que vous donnez, je ne suis pas sûr que la plupart des programmeurs (moyens) conçoivent l'opérateur d'accès aux membres ou l'opérateur d'index de tableau comme étant des opérateurs au sens mathématique, mais les considèrent plutôt comme des noms en langage naturel et la multiplication opérateur comme verbe. C'est pourquoiint i, j, k = 0;
est une construction si diabolique, car elle se présente comme l'analogue du langage naturel des "variables int i, j et k, sont déclarées et doivent être mises à 0"!*a[i]
, je ne pense pas que vous puissiez suffisamment analyser cela avec l'analogie des "noms". Quant à celaint i, j, k = 0;
, cela pourrait signifier n'importe quoi si vous ne recherchez pas les règles: une troisième interprétation serait de déclarerint i
, puis d'évaluerj
et enfin d'assignerk = 0
. À moins que vous ne connaissiez la syntaxe de votre langage, vous ne pouvez pas analyser de telles constructions. C'est votre problème si vous le faites de toute façon.a[i]
tant qu'opérateur d'index appliquéa
, mais plutôt lu ensemble comme un élément syntaxique irréductible spécifiant l'opérande de l'opérateur de multiplication, et donc je n'ai même pas été invité à évaluer la priorité. (1/2)