L'opérateur virgule évalue tous les opérandes de gauche à droite, et le résultat est la valeur de la dernière opérande.
Elle est surtout utile pour des boucles si vous voulez faire plusieurs actions de la "incrémenter" partie, de l'e.g (inversion d'une chaîne de caractères)
for (int lower = 0, upper = s.size() - 1; lower < upper; ++lower, --upper)
std::swap(s[lower], s[upper]);
Un autre exemple, où il pourrait être une option (pour trouver toutes les occurrences dans une chaîne de caractères):
#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;
}
}
En particulier, la logique et ne peut pas être utilisé pour cette condition, car à la fois nulle et non nulle peut dire que le personnage a été trouvé dans la chaîne. Avec la virgule, d'autre part, position = s.find()
est appelé à chaque fois que la condition est évaluée, mais le résultat de cette partie de la condition est tout simplement ignorés.
Naturellement, il existe d'autres façons d'écrire la boucle:
while ((position = s.find('a', search_position)) != std::string::npos)
ou tout simplement
while (true) {
position = s.find('a', search_position);
if (position == std::string::npos)
break;
...
}