Ich habe bei der Überarbeitung verschiedener Teile des C- und C ++ - Codes mehrfach festgestellt, dass ein Komma anstelle eines Semikolons verwendet wird, um Anweisungen zu trennen. Etwas wie das;
int a = 0, b = 0;
a = 5, b = 5;
Wo ich erwartet hätte
int a = 0, b = 0;
a = 5; b = 5;
Ich weiß, dass C und C ++ die Verwendung von Kommas zur Trennung von Anweisungen (insbesondere von Schleifenüberschriften) zulassen, aber was ist der Unterschied zwischen diesen beiden Codeteilen, wenn überhaupt? Ich vermute, dass das Komma als Ergebnis des Ausschneidens und Einfügens belassen wurde, aber ist es ein Fehler und wirkt es sich auf die Ausführung aus?
int a = 0, b = 0;
.int* a, b;
das nicht dasselbe ist wieint* a; int* b;
int *a, b;
Antworten:
Es macht keinen Unterschied in dem Code, den Sie gepostet haben. Im Allgemeinen trennt das Komma Ausdrücke wie ein Semikolon. Wenn Sie jedoch das Ganze als Ausdruck nehmen, bedeutet der Kommaoperator, dass der Ausdruck bis zum letzten Argument ausgewertet wird.
Hier ist ein Beispiel:
b = (3, 5);
Wird 3, dann 5 auswerten und letzteres b zuweisen. Also
b = 5
. Beachten Sie, dass die Klammern hier wichtig sind:b = 3, 5;
Wird ausgewertet
b = 3
, dann ist 5 und das Ergebnis des gesamten Ausdrucks ist trotzdem 5b == 3
.Der Komma-Operator ist besonders hilfreich in for-Schleifen, wenn Ihr Iterator-Code nicht einfach
i++
ist, Sie jedoch mehrere Befehle ausführen müssen. In diesem Fall funktioniert ein Semikolon nicht gut mit der For-Loop-Syntax.quelle
a[j, k]
statta[j][k]
normalerweise führt zu unbeabsichtigten Ergebnissen.Das Komma ist ein Operator, der einen Wert zurückgibt, der immer das 2. (rechte) Argument ist, während ein Semikolon nur Anweisungen beendet. Auf diese Weise kann der Kommaoperator in anderen Anweisungen verwendet oder mehrere Anweisungen so verkettet werden, dass sie als eine angezeigt werden.
Hier wird die Funktion f (x) aufgerufen und dann
x > y
für die if-Anweisung ausgewertet.if( y = f(x), x > y )
Ein Beispiel, wenn es nur verwendet wird, um die Notwendigkeit eines Blocks zu vermeiden
if( ... ) x = 2, y = 3; if( ... ) { x = 2; y = 3; }
quelle
Der Kommaoperator wertet alle Operanden von links nach rechts aus und das Ergebnis ist der Wert des letzten Operanden.
Dies ist vor allem in for-Schleifen nützlich, wenn Sie im "Inkrement" -Teil mehrere Aktionen ausführen möchten, z. B. (Umkehren einer Zeichenfolge).
for (int lower = 0, upper = s.size() - 1; lower < upper; ++lower, --upper) std::swap(s[lower], s[upper]);
Ein weiteres Beispiel, bei dem es sich möglicherweise um eine Option handelt (alle Vorkommen in einer Zeichenfolge finden):
#include <string> #include <iostream> int main() { std::string s("abracadabra"); size_t search_position = 0; size_t position = 0; while (position = s.find('a', search_position), position != std::string::npos) { std::cout << position << '\n'; search_position = position + 1; } }
Insbesondere logisch und kann für diese Bedingung nicht verwendet werden, da sowohl Null als auch Nicht-Null bedeuten können, dass das Zeichen in der Zeichenfolge gefunden wurde. Mit Komma wird dagegen
position = s.find()
jedes Mal aufgerufen, wenn die Bedingung ausgewertet wird, aber das Ergebnis dieses Teils der Bedingung wird einfach ignoriert.Natürlich gibt es auch andere Möglichkeiten, die Schleife zu schreiben:
while ((position = s.find('a', search_position)) != std::string::npos)
oder nur
while (true) { position = s.find('a', search_position); if (position == std::string::npos) break; ... }
quelle
Wie Frank erwähnt hat , verursacht die Verwendung des Kommaoperators in Ihrem Beispiel keinen Fehler. Der Kommaoperator kann aus mehreren Gründen verwirrend sein:
Da dies verwirrend und häufig unnötig ist, sollte der Kommaoperator bis auf einige sehr spezifische Situationen vermieden werden:
for
Anweisung auszuführenDer Komma-Operator ist per Definition ein hackiger Operator - er dient dazu, zwei Dinge zu hacken, bei denen nur einer erlaubt ist. Es ist fast immer hässlich, aber manchmal ist das alles, was Sie haben. Und dies ist das einzige Mal, dass Sie es verwenden sollten. Wenn Sie eine andere Option haben, verwenden Sie nicht den Komma-Operator.
Ich kann mir nicht allzu viele andere Gründe vorstellen, den Operator zu verwenden, da Sie einen ähnlichen Effekt erzielen können, wenn Sie die Ausdrücke in den meisten anderen Situationen in separaten Anweisungen auswerten (obwohl ich sicher bin, dass jemand einen Kommentar abgeben wird eine andere Verwendung, die ich übersehen habe).
quelle
Eine Verwendung wäre beim Code-Golfen:
if (x == 1) y = 2, z = 3; if (x == 1) { y = 2; z = 3; }
Die erste Zeile ist kürzer, aber das sieht zu verwirrend aus, um es in der regulären Entwicklung zu verwenden.
quelle
{y=2;z=3;}