Es gibt ein allgemeines Argument für die Initialisierung mehrerer Variablen in einem Einzeiler, nämlich:
Betrachten Sie zum Beispiel int i, j = 1; Dies könnte dazu führen, dass einige Leute fälschlicherweise glauben, dass beide Variablen initialisiert werden
Wir könnten argumentieren, dass jemand die Syntax seiner Sprache genug kennen sollte, um sich nicht zu irren. Ein weiteres Argument könnte sein, dass wir als Entwickler so viele Sprachen lernen, dass wir Fehler zwischen den Besonderheiten zwischen den Sprachen machen können.
Für diesen speziellen Fall frage ich mich jedoch, ob es überhaupt eine Sprache gibt, in der die Syntax i, j = 1 beide Variablen initialisiert.
Wenn nicht, trifft dieses Argument nicht zu.
programming-languages
syntax
Walfrat
quelle
quelle
Dim Apple, Orange, Pear as Fruit
ist eine rechtliche Erklärung. Angenommen, Sie kennen VB nicht. Ist Ihr erster EindruckApple
vom TypFruit
? Es ist nicht. Denken Sie daran, dass Sprachen häufig von Personen gelesen werden, die keine Experten für diese Sprache sind. Wenn Sie ein Experte sind, verwenden Sie die Sprache mit Bedacht, um Ihre Absichten auch Nicht-Experten klar mitzuteilen. Ich verwende niemals mehrere Initialisierungen in einer Sprache.var x = 1, y = 1.5;
Ist dies dasselbe wieint x = 1; double y = 1.5;
oder ist es dasselbe wiedouble x = 1, y = 1.5;
? Als wirvar
C # 3.0 hinzufügten , führte ich eine Umfrage durch und stellte fest, dass ungefähr die Hälfte der Leute glaubte, dass die erste "offensichtlich" korrekt war und die andere Hälfte glaubte, dass die andere "offensichtlich" korrekt war, und so machten wir es illegal. Ein Merkmal, das die Hälfte der Bevölkerung völlig irreführt, ist ein schlechtes Merkmal.Antworten:
Ich denke nicht, aber das ist nicht der Punkt. Der Punkt ist , dass
i, j = 0
ist sehr leicht verwechselti = j = 0
, was tut beide initialize. Klarheit ist neben Korrektheit die wichtigste Anforderung an den Quellcode, und die Tatsache, dass diese Frage sogar auftaucht, zeigt, dass die Klarheit nicht optimal ist.quelle
int i, j=1
gegenüberint i; int j = 1
(oder noch besser, getrennten Zeilen)?"Ich denke, Sie können für beide Seiten argumentieren:
Kontra
i, j = 0
:Mathematiker verwenden dies, um zu bedeuten, dass beide
i
undj
Null sein sollen.Pro
i, j = 0
:Es ist ganz einfach, den Vorrang Ihrer Bediener zu kennen. Und wenn Sie Zweifel an ihrem Vorrang haben, ist es jetzt an der Zeit, nachzuschlagen.
Es ist der gleiche Grund, warum wir Dinge wie
a.b += c[i]*d[i];
ohne Klammern schreiben . Dies ist natürlich gleichbedeutend mit(a.b) += ((c[i])*(d[i]));
, aber von Programmierern kann erwartet werden, dass sie die Priorität der am häufigsten verwendeten Operatoren auswendig können und die Priorität von Operatoren nachschlagen können, wenn sie sich nicht sicher sind. Daher werden Klammern im Allgemeinen als nutzlose Unordnung angesehen, es sei denn, sie erzwingen eine andere Bewertungsreihenfolge, als es die Priorität des Bedieners vorschreiben würde.Natürlich gibt es Ausnahmen. Der Vorrang von
<<
und+
wird in beiden Fällen im Allgemeinen als mehrdeutig genug angesehen, um Klammern zu warnen. Aber das ist die Ausnahme, die die Regel bestätigt.Zum einen würde ich eher auf die Pro-Seite fallen, aber ich bin bereit, mich an jeden Styleguide zu halten, der solche Erklärungen verbietet. Es lohnt sich einfach nicht, darüber zu streiten.
quelle
int i, j = 0;
keine Operatoren darin sind. Der einzige Ausdruck in dieser Anweisung ist,0
und daher kommt die Operatorpriorität nicht dazu. Der Parser behandelt nicht,
als Kommaoperator oder=
als Zuweisungsoperator. Vielmehr sind dies grammatikalische Teile der Deklarationserklärung.but programmers can be expected to know the precedence of the most used operators by heart
, du sagst. In dem Beispiel, das Sie geben, bin ich mir nicht sicher, ob die meisten (durchschnittlichen) Programmierer den Elementzugriffsoperator oder den Arrayindexoperator überhaupt als Operatoren im mathematischen Sinne verstehen, sondern sie eher als Substantive in natürlicher Sprache und als Multiplikation betrachten Operator als Verb. Deshalbint i, j, k = 0;
ist es so ein teuflisches Konstrukt, weil es als natürliches Sprachanalog von "int Variablen i, j und k werden deklariert und sollen auf 0 gesetzt werden" darstellt!*a[i]
, wenn Sie Dinge wie sehen . Ich glaube nicht, dass Sie dies mit der Analogie "Substantive" ausreichend analysieren können. Wasint i, j, k = 0;
, das könnte alles bedeuten , wenn Sie die Regeln nicht sehen: Eine dritte Interpretation zu erklären wäreint i
, dann auswertenj
und schließlich assignk = 0
. Wenn Sie die Syntax Ihrer Sprache nicht kennen, können Sie solche Konstrukte nicht analysieren. Es ist dein Problem, wenn du es trotzdem tust.a[i]
als Indexoperator gelesen , auf den angewendet wurdea
, sondern beide zusammen als irreduzibles syntaktisches Element gelesen, das den Operanden des Multiplikationsoperators angibt, und daher wurde ich nicht einmal aufgefordert, die Priorität zu bewerten. (1/2)