Die Reihenfolge, in Welche Funktionsargumente ausgewertet werden, ist nicht angegeben, so dass die Anweisung
printf("%d %d\n", ++n, power(2, n)); /* WRONG */
kann unterschiedliche Ergebnisse mit verschiedenen Compilern erzeugen, abhängig von , ob n erhöht wird, bevor die Stromversorgung aufgerufen wird. Die Lösung ist natürlich
++n;
printf("%d %d\n", n, power(2, n));
Funktionsaufrufe, verschachtelte Zuordnung Anweisungen und Schrittweite und Dekrementoperatoren Ursache `` Seite Effekte ‚‘ zu schreiben - eine Variable als Nebenprodukt geändert wird der Auswertung von ein Ausdruck. In jedem Ausdruck mit Nebenwirkungen kann subtile Abhängigkeiten in der Reihenfolge in welche Variablen, die an der Ausdruck teilnehmen aktualisiert werden. Eine unglückliche Situation wird durch die Aussage typisiert
a[i] = i++;
Die Frage ist, ob der Index ist der alte Wert von i oder die neuen. Compiler können dies in verschiedene Möglichkeiten interpretieren, und generieren unterschiedliche Antworten in Abhängigkeit von ihrer Interpretation. Der Standard lässt absichtlich die meisten derartigen Angelegenheiten nicht spezifiziert. Wenn Nebeneffekte (Zuordnung zu Variablen) in einem Ausdruck stattfinden, wird die Diskretion des Compilers überlassen, da die beste Reihenfolge stark von Maschine Architektur abhängt.(Der Standard ist angeben, dass alle Nebenwirkungen auf Argumente wirksam werden, bevor eine Funktion aufgerufen wird, aber das wäre nicht Hilfe bei dem Anruf über printf). Die Moral ist, dass das Schreiben von Code, dass auf Reihenfolge der Auswertung hängt ist eine schlechte Programmierpraxis in irgendeiner Sprache. Natürlich ist es notwendig zu wissen, welche Dinge zu vermeiden, aber wenn Sie nicht wissen, wie sie auf verschiedenen Maschinen getan werden, werden Sie nicht versucht werden , um eine bestimmte Implementierung zu nutzen.
Es wäre wahrscheinlich klarer, wenn Sie in Ihrem Beispielprogramm verschiedene Variablen verwendet hätten. Außerdem sollten Sie "\ n" * nach * die Werte, die Sie drucken, nicht vorher eingeben. Dies wird derzeit gedruckt "2 23" – DevinB
Sie sollten etwas versuchen, das klarer ist. Diese Syntax ist für einen Menschen ziemlich seltsam. Machen Sie den Code einfach, versuchen Sie nicht, komplizierte Sachen zu schreiben. – INS