Ich bin auf dieses Stück Code gestoßen. Ich verwende im Allgemeinen ‘&&’ oder ‘||’ mehrere Bedingungen in a trennen for Schleife, aber dieser Code verwendet dafür 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 Kommas getrennte Bedingung zu überprüfen.
Schlechter Code. Sie haben Recht; mehrere Bedingungen sollten mit && oder || verbunden werden.
– Kaleb
31. Mai 2013 um 13:59 Uhr
Fünf Antworten, jeder nimmt die Frage zu wörtlich und erklärt, was ein Komma bewirkt, und keine einzige Antwort, die darauf hindeutet, dass dies schrecklich, schrecklich kaputt ist.
– Eduard Thomson
31. Mai 2013 um 14:00 Uhr
Laut den Suchmaschinen ist dies die kanonische Frage. Allerdings diese Art von Frage muss wurden 2008 oder 2009 gefragt. Was ist das?
– Peter Mortensen
1. September um 22:09 Uhr
Hier ist einer von 2011, aber er ist nicht wirklich kanonisch.
– Peter Mortensen
1. September um 22:27 Uhr
Es ist ein seltsamer Ort für den Kommaoperator. Vielleicht von einem Programmierquiz? Ich hatte erwartet, dass es eine kanonische Frage zu seiner normalen idiomatischen Verwendung gibt, aber ich konnte sie nicht finden (warum nicht “Was ist der Zweck des Komma-Operators hier” wurde gefragt?). Wikipedia hat es: “Die häufigste Verwendung ist zumehrere Zuweisungsanweisungen zulassen, ohne eine Blockanweisung zu verwenden, hauptsächlich in der Initialisierung und den Inkrementausdrücken von afür Schleife.Dies ist die einzige idiomatische Verwendung in der elementaren C-Programmierung.”
– Peter Mortensen
Vor 2 Tagen
Der Kommaoperator wertet alle seine Operanden aus und liefert den Wert des letzten. Also im Grunde egal, welche Bedingung Sie schreiben Erste, es wird nicht beachtet, und die zweite nur einer wird signifikant sein.
for (i = 0; j >= 0, i <= 5; i++)
ist also gleichbedeutend mit
for (i = 0; i <= 5; i++)
was je nach Absicht des Autors des Codes beabsichtigt sein kann oder nicht – ich hoffe, dies ist kein Produktionscode, denn wenn der Programmierer, der dies geschrieben hat, eine UND-Verknüpfung zwischen den Bedingungen ausdrücken wollte, dann ist dies falsch und das && Operator hätte stattdessen verwendet werden sollen.
Der wichtige Punkt hier ist, dass der fragliche Code falsch ist.
– Kaleb
31. Mai 2013 um 14:02 Uhr
@Caleb In welchem Sinne? Ich glaube, ich verstehe, was Sie vorzuschlagen versuchen. Ich bin mir nur nicht sicher, ob es so wie es ist in die Antwort aufgenommen werden kann oder sollte.
– Benutzer529758
31. Mai 2013 um 14:03 Uhr
Dies kann nicht das sein, was der Autor beabsichtigt hat, da es bedeutungslos ist. Ich würde keinem Code dieses Autors vertrauen.
– Lee Daniel Crocker
31. Mai 2013 um 14:06 Uhr
Die erste Bedingung, j>=0, wird ausgewertet, aber das Ergebnis wird nie verwendet. Die Schleife wird fortgesetzt, solange I 5 nicht überschreitet, auch wenn j kleiner als 0 ist. It sieht aus als würde die Schleife bei j = -1 anhalten, aber das wird es nicht. Schwer, das anders als kaputt zu nennen.
– Kaleb
31. Mai 2013 um 14:07 Uhr
Ja, es ist kein Produktionscode. Ich habe gerade meine C-Grundlagen überarbeitet und bin auf eine Website gestoßen, die einige Multiple-Choice-Fragen enthielt, auf denen ich darauf gestoßen bin. Danke für die Antwort.
– Prateek
31. Mai 2013 um 21:17 Uhr
Shin Takezou
Natürlich ist es richtig, was Sie am Anfang sagen, und C logischer Operator&& und || sind das, was Sie normalerweise verwenden, um Bedingungen zu “verbinden” (Ausdrücke, die als wahr oder falsch ausgewertet werden können); Der Kommaoperator ist kein logischer Operator und seine Verwendung in diesem Beispiel macht keinen Sinn, wie von anderen Benutzern erklärt wurde. Sie können es zB verwenden, um Anweisungen in for selbst zu “verketten”: Sie können j zusammen mit i initialisieren und aktualisieren; oder verwenden Sie den Kommaoperator auf andere Weise
#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;
}
Der Kommaausdruck nimmt den Wert von an letzte (z. B. ganz rechts) Ausdruck.
In Ihrer ersten Schleife ist also der einzige steuernde Ausdruck i<=5; und j>=0 wird ignoriert.
In der zweiten Schleife j>=0 steuert die Schleife, und i<=5 wird ignoriert.
Was ein Grund… es gibt keinen Grund. Dieser Code ist gerecht falsch. Der erste Teil der Komma-Ausdrücke tut es nichts außer Programmierer verwirren. Wenn ein ernsthafter Programmierer das geschrieben hat, sollte er sich schämen und seine Tastatur einziehen lassen.
Verwenden Sie diesen Code nicht; wer auch immer 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 dann weg und macht nichts damit. Dann wertet es “i <= 5" aus und verwendet das, und nur das, als Bedingung für das Beenden der Schleife. Der Kommaoperator kann in einer Schleifenbedingung sinnvoll verwendet werden, wenn der linke Operand Seiteneffekte hat; Sie werden oft Dinge sehen wie:
for (i = 0, j = 0; i < 10; ++i, ++j) . . .
in dem das Komma verwendet wird, um zusätzliche Initialisierungs- und Inkrementanweisungen einzuschleusen. Aber der gezeigte Code macht das nicht oder irgendetwas anderes Sinnvolles.
„In den Programmiersprachen C und C++ ist der Kommaoperator (dargestellt durch das Token ,) ist ein binärer Operator, der seinen ersten Operanden auswertet und das Ergebnis verwirft und dann den zweiten Operanden auswertet und diesen Wert (und Typ) zurückgibt.”
-1 Das Zitieren aus Wikipedia beantwortet nicht die Frage, was das Komma nicht bewirkt, sondern warum es hier verwendet wird.
– Kaleb
31. Mai 2013 um 14:09 Uhr
@Caleb, ehrlich gesagt glaube ich nicht, dass die Frage nach dem Warum fragt. Weil es heißt: “Überraschenderweise variiert die Ausgabe, wenn ich die Reihenfolge der Bedingungen ändere”. Daher antwortet das Zitieren.
– Tafa
31. Mai 2013 um 14:15 Uhr
In C gibt es einen Operator namens Komma-Operator. Es führt jeden Ausdruck der Reihe nach aus und gibt den Wert der letzten Anweisung zurück. Es ist auch ein Sequenzpunktwas bedeutet, dass jeder Ausdruck garantiert vollständig und in der richtigen Reihenfolge ausgeführt wird, bevor der nächste Ausdruck in der Reihe ausgeführt wird, ähnlich wie && oder ||.
-1 Das Zitieren aus Wikipedia beantwortet nicht die Frage, was das Komma nicht bewirkt, sondern warum es hier verwendet wird.
– Kaleb
31. Mai 2013 um 14:09 Uhr
@Caleb, ehrlich gesagt glaube ich nicht, dass die Frage nach dem Warum fragt. Weil es heißt: “Überraschenderweise variiert die Ausgabe, wenn ich die Reihenfolge der Bedingungen ändere”. Daher antwortet das Zitieren.
– Tafa
31. Mai 2013 um 14:15 Uhr
Nikos M.
Um Mr. Crockers Antwort zu vervollständigen, seien Sie vorsichtig mit den Operatoren ++ oder — oder ich kenne vielleicht andere Operatoren nicht. Sie können die Schleife beeinflussen. Ich habe zum Beispiel in einem Kurs einen ähnlichen Code wie diesen 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 Ergebnis der folgenden viele Nullen sind.
for(int i=0; i<3; printf(" %d", i));
13838400cookie-checkMehrere Bedingungen in einer C-‘for’-Schleifeyes
Schlechter Code. Sie haben Recht; mehrere Bedingungen sollten mit && oder || verbunden werden.
– Kaleb
31. Mai 2013 um 13:59 Uhr
Fünf Antworten, jeder nimmt die Frage zu wörtlich und erklärt, was ein Komma bewirkt, und keine einzige Antwort, die darauf hindeutet, dass dies schrecklich, schrecklich kaputt ist.
– Eduard Thomson
31. Mai 2013 um 14:00 Uhr
Laut den Suchmaschinen ist dies die kanonische Frage. Allerdings diese Art von Frage muss wurden 2008 oder 2009 gefragt. Was ist das?
– Peter Mortensen
1. September um 22:09 Uhr
Hier ist einer von 2011, aber er ist nicht wirklich kanonisch.
– Peter Mortensen
1. September um 22:27 Uhr
Es ist ein seltsamer Ort für den Kommaoperator. Vielleicht von einem Programmierquiz? Ich hatte erwartet, dass es eine kanonische Frage zu seiner normalen idiomatischen Verwendung gibt, aber ich konnte sie nicht finden (warum nicht “Was ist der Zweck des Komma-Operators hier” wurde gefragt?). Wikipedia hat es: “Die häufigste Verwendung ist zu mehrere Zuweisungsanweisungen zulassen, ohne eine Blockanweisung zu verwenden, hauptsächlich in der Initialisierung und den Inkrementausdrücken von a für Schleife. Dies ist die einzige idiomatische Verwendung in der elementaren C-Programmierung.”
– Peter Mortensen
Vor 2 Tagen