it-swarm.com.de

Mehrere Bedingungen in einer C-for-Schleife

Ich bin auf diesen Code gestoßen. Ich verwende generell '&&' oder '||' um mehrere Bedingungen in einer for-Schleife zu trennen, aber dieser Code verwendet dazu Kommas.

Überraschenderweise variiert die Ausgabe, wenn ich die Reihenfolge der Bedingungen ändere.

#include<stdio.h>

int main() {
    int i, j=2;

    for(i=0; j>=0,i<=5; i++)
    {
         printf("%d ", i+j);
         j--;
    }
    return 0;
}

Ausgabe = 2 2 2 2 2 2

#include<stdio.h>

int main(){
    int i, j=2;

    for(i=0; i<=5,j>=0; i++)
    {
         printf("%d ", i+j);
         j--;
    }
    return 0;
}

Ausgabe = 2 2 2

Kann jemand den Grund erklären? Es scheint nur die letzte durch Komma getrennte Bedingung zu prüfen.

25
Prateek

Der Kommaoperator wertet alle Operanden aus und liefert den Wert des letzten Operanden. Unabhängig davon, welche Bedingung Sie zuerst schreiben, wird sie ignoriert und die Sekunde wird nur von Bedeutung sein.

for (i = 0; j >= 0, i <= 5; i++)

ist also gleichbedeutend mit

for (i = 0; i <= 5; i++)

was der Autor des Codes beabsichtigt hat oder nicht, hängt von seinen Absichten ab - ich hoffe, dass dies kein Produktionscode ist, denn wenn der Programmierer, der diesen Code geschrieben hat, ein UND-Verhältnis zwischen den Bedingungen ausdrücken wollte, dann ist dies falsch und das && Operator sollte stattdessen verwendet werden.

50
user529758

Natürlich ist es richtig, was Sie am Anfang sagen, und C logischer Operator&& und || sind das, was Sie normalerweise zum "Verbinden" von Bedingungen verwenden (Ausdrücke, die als wahr oder falsch bewertet werden können); Der Kommaoperator ist kein logischer Operator, und seine Verwendung in diesem Beispiel macht keinen Sinn, wie von anderen Benutzern erläutert. Sie können es verwenden, z. "Verketten" von Anweisungen in für sich selbst: Sie können j zusammen mit i initialisieren und aktualisieren. oder verwenden Sie den Kommaoperator in otherways

#include <stdio.h>

int main(void)  // as std wants
{
  int i, j;

  // init both i and j; condition, we suppose && is the "original"
  // intention; update i and j
  for(i=0, j=2; j>=0 && i<=5; i++, j--)
  {
       printf("%d ", i+j);
  }
  return 0;        
}
6
ShinTakezou

Der Kommaausdruck nimmt den Wert des last (zB ganz rechts) -Ausdrucks an.

In Ihrer ersten Schleife ist der einzige steuernde Ausdruck i<=5; und j>=0 wird ignoriert.

In der zweiten Schleife steuert j>=0 die Schleife und i<=5 wird ignoriert.


Für einen Grund ... gibt es keinen Grund. Dieser Code ist gerade falsch . Der erste Teil der Komma-Ausdrücke bewirkt nothing, außer Programmierer zu verwirren. Wenn ein ernsthafter Programmierer dies schrieb, sollten sie sich schämen und ihre Tastatur sperren lassen.

5
abelenky

Verwenden Sie diesen Code nicht. Wer es geschrieben hat, hat eindeutig ein grundlegendes Missverständnis der Sprache und ist nicht vertrauenswürdig. Der Ausdruck:

j >= 0, i <= 5

wertet "j> = 0" aus, wirft es weg und tut nichts damit. Dann wertet es "i <= 5" aus und verwendet das und nur das als Bedingung zum Beenden der Schleife. Der Kommaoperator can kann sinnvoll in einer Schleifenbedingung verwendet werden, wenn der linke Operand Nebenwirkungen hat. Sie sehen oft Dinge wie:

for (i = 0, j = 0; i < 10; ++i, ++j) . . .

in denen das Komma verwendet wird, um zusätzliche Initialisierungs- und Inkrementierungsanweisungen einzuschleichen. Aber der gezeigte Code macht das nicht oder irgendetwas anderes sinnvoll.

3

Wikipedia sagt, was der Kommaoperator macht:

"In den Programmiersprachen C und C++ ist der Kommaoperator (dargestellt durch das Token ,) ein binärer Operator, der seinen ersten Operanden auswertet und das Ergebnis verwirft, dann den zweiten Operanden auswert und diesen Wert (und den Typ) zurückgibt."

3
tafa

In C gibt es einen Operator, den Kommaoperator. Er führt jeden Ausdruck der Reihe nach aus und gibt den Wert der letzten Anweisung zurück. Es ist auch ein Sequenzpunkt , was bedeutet, dass jeder Ausdruck garantiert vollständig und in der Reihenfolge ausgeführt wird, bevor der nächste Ausdruck in der Serie ausgeführt wird, ähnlich wie && oder ||

2

Wenn Sie die Antwort von Herrn Crocker abschließen, seien Sie vorsichtig mit ++ oder - Operatoren oder ich kenne vielleicht andere Operatoren nicht .. Sie können die Schleife beeinflussen. Ich habe zum Beispiel einen ähnlichen Code in einem Kurs gesehen:

for(int i=0; i++*i<-1, i<3; printf(" %d", i));

Das Ergebnis wäre 1 2 $. Die erste Anweisung hat also die Schleife beeinflusst, während das folgende Ergebnis viele Nullen enthält.

for(int i=0; i<3; printf(" %d", i));
0
MSN