Wie gehen Sprachen mit Nebenwirkungen von zusammengesetzten Operatoren um?

8

Nehmen Sie eine solche Situation an:

%Vor%

In C und C ++ ist dies undefiniertes Verhalten, wie hier beschrieben: Nicht definierte Verhaltens- und Sequenzpunkte

Wie sieht diese Situation jedoch aus?

  • JavaScript,
  • Java,
  • PHP ...
  • C #
  • Nun, jede andere Sprache, die zusammengesetzte Operatoren hat?

Ich korrigiere ein Javascript - & gt; C ++ - Port, in dem dies an vielen Stellen unbemerkt blieb. Ich würde gerne wissen, wie andere Sprachen im Allgemeinen damit umgehen ... Die Reihenfolge undefiniert zu verlassen ist irgendwie spezifisch für C und C ++, nicht wahr?

    
Kos 14.02.2011, 13:56
quelle

4 Antworten

7

Laut ECMA Script specification , dem ich glaube, dass Javascript in Multiplikations- und Additionsanweisungen konform sein soll, wertet es die linke Seite vor der Auswertung der rechten Seite aus. (siehe 11.5 und 11.6). Ich denke, das bedeutet, dass der Code

entsprechen sollte %Vor%

Sie sollten jedoch nicht immer darauf vertrauen, dass die Spezifikation der Implementierung entspricht!

In verwirrenden Fällen wie diesem ist es am besten, wenn Sie mit verschiedenen Eingaben zu den mehrdeutigen Codezeilen in der ursprünglichen Betriebsumgebung experimentieren und versuchen, herauszufinden, was es tut. Stellen Sie sicher, dass Sie Fälle testen, die eine Hypothese bestätigen können, und testen Sie Fälle, die sie fälschen können.

Edit: Offensichtlich implementiert JavaScript die 3. Ausgabe von ECMAScript, also habe ich stattdessen die Verknüpfung zu dieser Spezifikation geändert.

    
Null Set 14.02.2011, 16:52
quelle
3

Wenn Sie die Regeln für einen Ausdruck fragen oder nachschlagen müssen, sollten Sie diesen Ausdruck praktisch nicht in Ihrem Code verwenden. Jemand anderes wird in zwei Jahren zurückkommen und es falsch verstehen, dann es umschreiben und den Code brechen.

Wenn dies eine rein theoretische Frage sein sollte, kann ich leider keine Angaben zu diesen anderen Sprachen machen.

    
Mark B 14.02.2011 15:04
quelle
2

Für JavaScript sollte der folgende Artikel hilfreich sein.

Dieser Artikel gibt eindeutig an, ob eine bestimmte Kombination von

a OP b OP c geht von links nach rechts und in dieser Reihenfolge.

Ich weiß nichts über die anderen Sprachen.

    
Raynos 14.02.2011 15:36
quelle
1
  

Wie sieht diese Situation jedoch aus: JS, Java, PHP, C # ...

Um vollkommen ehrlich zu sein, sieht int a = (--t)*(t-2); int b = (t/=a)+t; wie Mist aus.

Es ist schön, einen ausgefallenen Code zu haben, der hübsch und elitär sein kann, aber das ist absolut nicht nötig. Die Lösung für jede Sprache, wenn sie mit Code wie diesem konfrontiert wird, besteht darin, ein paar weitere Semikolons hinzuzufügen (es sei denn, Sie beschäftigen sich mit Python):

%Vor%

Wenn eine andere Reihenfolge der Operationen gewünscht wird, passen Sie die Zeilen entsprechend an. Wenn Sie versuchen, alten Buggy-Code zu reparieren, den Code reparieren , implementieren Sie die Spaghetti eines anderen nicht einfach neu.

Bearbeiten zum Hinzufügen:

Ich erkannte, dass ich die ursprüngliche Frage nie speziell beantwortet habe:

  

Wie gehen Sprachen mit Nebenwirkungen von zusammengesetzten Operatoren um?

Schlecht.

    
zzzzBov 14.02.2011 15:22
quelle