2017-01-12 8 views
1

Prog 1:C Programming - Komma-Operator innerhalb while-Schleife

#include<stdio.h> 
int main() 
{ 
    int i=0; 
    while(i<=8,i++); 
    printf("%d",i); 
    return 0; 
    } 

Prog 2:

#include<stdio.h> 
int main() 
{ 
    int i=0; 
    while(i++,i<=8); 
    printf("%d",i); 
    return 0; 
} 

Der Ausgang des Prog 1 1 ist, und dass der Prog 2 9.

Kann jemand erklären, was hier geht? Wie unterscheiden sich die beiden Codes?

Antwort

2

Der Komma-Operator wertet beide Argumente nacheinander aus und verwirft das Ergebnis mit Ausnahme des letzten. Der letzte ausgewertete Ausdruck bestimmt das Ergebnis des gesamten Ausdrucks.

i<=8,i++ - hier ist der Wert des Ausdrucks der Wert i++, der vor dem Inkrementieren der Wert i ist. Es ist 0, so dass die Schleife sofort beendet wird.

i++,i<=8 - hier der Wert des Ausdrucks ist der Wert von i<=8 die 0 nur, wenn i bis 9.

Auf eine persönliche Note erhöht wird: Ich habe die zweite Form denken, während etwa vergleichbar mit einer for-Schleife , ist für den Leser des Codes weniger klar als eine tatsächliche for-Schleife.

0

Der Ausdruckseparatoroperator , erzwingt die Auswertung von links nach rechts und ist auch ein Sequenzierungspunkt.

Prog 1: betrachten i <= 8, i++. i <= 8 wird ausgewertet und verworfen, dann wird i++ ausgewertet. Der gesamte Ausdruck hat den nichtinkrementierten Wert von i. Da i anfänglich 0 ist, endet die while-Schleife bei der ersten Iteration. Die Ausgabe wird der einzeln inkrementierte Wert von i sein, d.h. 1.

Prog 2: i++ ausgewertet wird und das Ergebnis verworfen, dann wird mit dem i <= 8 da neuen Wert voni ausgewertet , ist ein Sequenzierungspunkt. So läuft die while Schleife, bis i <= 8 nicht mehr true mit dem inkrementierten Wert i ist. Die Ausgabe ist 9.

0
while (condition) 
    statement 

Anweisung wird wiederholt ausgeführt. Vor jeder einzelnen Ausführungsbedingung (Iteration) wird ausgewertet. Wenn es falsch ist, wird die while-Schleife beendet und die Ausführung wird darüber hinaus fortgesetzt.

In diesem Fall ist die Anweisung leer. Die Anweisung könnte entweder eine einzelne Codezeile sein, die mit einem Semikolon (;) endet, oder ein Blockcode in geschweiften Klammern ({,}).

Daher passiert es, dass die Bedingung kontinuierlich ausgewertet wird, bis sie false ergibt. Um zu verstehen, was vor sich geht, müssen wir untersuchen, wie der Komma-Operator funktioniert.

(Beachten Sie, während Komma als ein Zeichen an Orten in C verwendet werden kann - ich kann an Funktionsdeklarationen, Definitionen und Aufrufe denken - in diesem Fall ist Komma Teil der Bedingung, daher fungiert es als Operator.)

Komma-Operator bewirkt, dass Ausdruck zuerst ausgewertet wird, dann Ausdruck2 und gibt den Wert von Ausdruck2 zurück.

Bei jeder Auswertung der Bedingung werden wir also beide Operanden auswerten (i ++, i < = 8) und weitermachen, während der rechte Operand als wahr verrechnet wird.

Während wir normalerweise Bedingung verwenden, um die Ausführung von Schleife zu steuern, oft, wie in diesem Fall, Bedingung kann andere Auswirkungen haben. In unserem Fall ist die Variable i von jeder Zustandsbewertung betroffen. Es wird um eins erhöht.

Unser Beispiel unterscheidet sich nur in der Reihenfolge der Operanden der Bedingung, daher in welchen Operanden Ergebnis wirklich die Ausführung der Schleife steuert.

Lassen Sie uns zuerst das zweite Beispiel untersuchen. In diesem Fall haben wir die Bedingung "i ++, i < = 8". Das bedeutet, dass wir bei jeder Auswertung zuerst i erhöhen, dann prüfen, ob es kleiner oder gleich 8 ist. Bei der ersten Bewertung der Bedingung werden wir also i von 0 auf 1 erhöhen und daraus schließen, dass 1 < = 8 ist. Die so konstruierte Schleife kann nur brechen, wenn i 9 wird, d. am 9. Iteration.

Wie im ersten Beispiel lautet die Bedingung "i < = 8, ++ i". Da der Vergleich keine Nebenwirkungen hat, können wir eine beliebige Anzahl von Vergleichen in beliebiger Reihenfolge durchführen, und wenn dies das einzige ist, was wir getan haben, nämlich wenn wir keine andere Aktion in einer von den Ergebnissen der Vergleiche abhängigen Art oder Reihenfolge durchgeführt haben, diese Vergleiche würden absolut nichts tun. Wie in unserem Fall evaluieren wir i < = 8, was wahr oder falsch ergibt, aber wir verwenden den Wert nicht, sondern fahren einfach fort, den rechten Operanden auszuwerten. Also ist unser Zustand praktisch gleich "i ++".

Dies ist ein unärer Operator der Post-Inkrementierung. Es gibt den Wert von i zurück und erhöht es dann nur um eins. (Alles, was garantiert ist, ist diese Reihenfolge. Wann genau ich erhöht wird, ist eigentlich ein kompliziertes und nicht immer in der Standardsache, wenn ich nicht falsch liege). Also, was passiert ist, überprüfen wir zuerst, ob ich wahr oder falsch bin, und dann, egal was, erhöhen wir es um eins, und erst dann brechen wir die Schleife oder fahren fort.

In C gibt es keinen wahren oder falschen Wert, keinen booleschen Typ. Ganzzahlen werden als wahr betrachtet, wenn sie einen Wert ungleich Null haben.

Also bei der ersten Auswertung von "i ++" erhalten wir 0, das ist falsch. Dies bedeutet, dass die Schleife ohne eine einzige Iteration unterbrochen wird. Die Auswertung von "i ++" führt jedoch dazu, dass sie um eins zunimmt. Wenn wir also mit der while-Schleife fertig sind, ist i bereits 1.

Verwandte Themen