2013-04-29 17 views
5

Sind die folgenden zwei Code-Blöcke genau gleich und das gleiche erreichen? Es zeigt die gleiche Sache, wenn ich das Programm laufen, aber ich würde eine rigorose Erklärung zu schätzen wissen.Ist etwas wie "für (i = 1; i <= 10; printf ("% d n "; i), i ++) gültig und UB-frei in C?

for(i=1;i<=10;i++) 
{ 
printf("%d\n",i); 
} 

und

for(i=1;i<=10;printf("%d\n",i),i++); 

die for Schleife erwartet gültig C Aussagen als Argumente, doesn Ist es aber, obwohl ich auf StackOverflow verifiziert habe, dass Aussagen wie x+=4,y=x*2; sicher sind, da das Komma als Folge fungiert Punkte hier, ist die gleiche Wahrheit für die Aussage printf("%d\n",i),i++) übergeben als Argument in der for Schleife oben?

Und wenn ja, stören Sie bitte die kleine Frage zu beantworten, die sich daraus ergeben:

  • Hat die comma wirken als Folge Punkte in einer Erklärung viele Komma Beteiligung getrennt

    Funktion wie unten ruft:

    printf("Enter number\n"),scanf("%d",&number),printf("You entered %d",number);

+4

Ja, aber warum möchten Sie Code so schreiben? (Komma ist ein Sequenzpunkt, solange es nicht das Komma innerhalb eines Funktionsaufrufs ist). – nhahtdh

+0

Ja, es ist Ok. Der Komma-Operator führt einen Sequenzpunkt ein. – wildplasser

+0

Es ist Teil des C-Standards .. lass mich die Referenz finden. –

Antwort

3

Dies ist absolut gültig und beide Anweisungen sind gleich dem Compiler. Für den Leser ist die zweite fast unlesbar, und das ist der einzige Unterschied. Es macht wenig Sinn, das zweite Format zu verwenden.

Ein Sequenzpunkt wird vom Komma-Operator eingeführt.

Referenz:

6.5.17 Kommaoperator

Para 2:

Der linke Operand eines Komma-Operator als ungültig Ausdruck ausgewertet wird; Es gibt einen Sequenzpunkt zwischen seiner Auswertung und dem des rechten Operanden. Dann wird der rechte Operand ausgewertet; das Ergebnis hat seine Art und value.114)

+0

Was wäre der technische Grund zu sagen, dass die folgende Aussage absurd ist? Int a, b, * ptr, printf ("Hallo"), printf ("Howdy"); '? Wäre es gültig, wenn '(int a, b, * ptr), printf (" Hallo "), printf (" Howdy ");'? –

1

Die Antwort ist in 6.8.5.3 der C-Standard:

1774 die Aussage

for (clause-1 ; expression-2 ; expression-3) statement 

verhält sich wie folgt:

1775 Der Ausdruck> Ausdruck-2 ist der steuernde Ausdruck, der vor jeder Ausführung des Schleifenkörpers ausgewertet wird.

1776 Der Ausdruck ausdruck-3 wird nach jeder Ausführung des Schleifenrumpfs als void-Ausdruck ausgewertet.

1777 Wenn Klausel-1 eine Deklaration ist, ist der Gültigkeitsbereich aller Bezeichner, die deklariert werden, der Rest der Deklaration und die gesamte Schleife , einschließlich der anderen beiden Ausdrücke;

1778 wird in der Reihenfolge der Ausführung vor der ersten Auswertung des steuernden Ausdrucks erreicht.

1779 Wenn Klausel-1 ein Ausdruck ist, wird es als ungültig Ausdruck vor der ersten Auswertung der Steuerung expression.134 ausgewertet wird)

1780 Beide Klausel-1 und Ausdruck-3 verzichtet werden kann.

1781 Ein ausgelassener Ausdruck-2 wird durch eine Konstante ungleich Null ersetzt.

Zwischen der Ausführung der printf-Anweisung und der Inkrementierung von i liegt ein Sequenzpunkt. Die printf Anweisung und i ist expression-3 in diesem Fall keine bedingte, so ist die Aussage gültig, aber nicht die beste Praxis.

+0

Was wäre der technische Grund zu sagen, dass die folgende Aussage absurd ist? Int a, b, * ptr, printf ("Hallo"), printf ("Howdy"); '? Wäre es gültig, wenn '(int a, b, * ptr), printf (" Hallo "), printf (" Howdy ");'? –

+0

@SheerFish: Es ist nicht anders als wenn ich es getan hätte: 'int a, b, c = 0;' Der Komma-Operator funktioniert genauso. Der Unterschied in meinem Beispiel ist die Zuordnung. Obwohl Ihre Beispiele nicht gut lesbar sind. –

+0

Soll ich es in eine andere Frage stellen? –