Der Kommaoperator wertet alle Operanden von links nach rechts aus, und das Ergebnis ist der Wert des letzten Operanden.
Es ist vor allem in for-Schleifen nützlich, wenn Sie mehrere Aktionen im "Inkrement"-Teil durchführen wollen, z.B. (Umkehrung einer Zeichenkette)
for (int lower = 0, upper = s.size() - 1; lower < upper; ++lower, --upper)
std::swap(s[lower], s[upper]);
Ein weiteres Beispiel, bei dem dies eine Option sein könnte (Suche nach allen Vorkommen in einer Zeichenkette):
#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 die logische y kann für diese Bedingung nicht verwendet werden, da sowohl Null als auch Nicht-Null bedeuten kann, dass das Zeichen in der Zeichenkette gefunden wurde. Mit Komma, auf der anderen Seite, position = s.find()
wird 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 einfach
while (true) {
position = s.find('a', search_position);
if (position == std::string::npos)
break;
...
}