opérateur virgule en si la condition
int a = 1, b = 0;
if(a, b)
printf("success\n");
else
printf("fail\n");
if(b, a)
printf("success\n");
else
printf("fail");
C'est un fichier cpp et j'ai eu la sortie de Visual Studio 2010
fail
success
Pourquoi ce comportement? Pourriez-vous expliquer?
- Vous savez que c'est à l'aide de l'opérateur virgule en l'état, mais vous devez vous demander?
- Vous pouvez simplement ajouter un point d'arrêt sur la première instruction et exécuter le programme ligne par ligne à l'aide de la touche F10 pour voir le flux vous-même.
- Je sais que virgule agit comme un point de séquence dans les déclarations, mais pas dans les arguments de fonctions.Pouvez-vous me dire si il est un point de séquence à l'intérieur de
if
?Je intuitivement sentir oui,mais je voudrais vous confirmer. - Le
if
prend une expression, donc dansif (a, b)
c'est l'opérateur virgule, donc d'un point de séquence. En fonction de listes d'arguments ou d'initialiser les listes, une virgule est juste un séparateur, pas l'opérateur virgule [bien, que l'on pourrait appelerprintf("%d\n", (1,2));
et alors nous aurions un opérateur virgule dans le deuxième argument deprintf
, mais nous avons besoin des parenthèses pour que]. - Pouvez-vous vous pencher sur cette question de la mienne s'il vous plaît.Je n'ai pas trouver la réponse dont j'avais besoin. stackoverflow.com/questions/16475918/...
Vous devez vous connecter pour publier un commentaire.
http://en.wikipedia.org/wiki/Comma_operator:
Dans votre premier
if
:a
est évaluée en premier et mis au rebut,b
est évalué deuxième et retourné comme 0. Si cette condition est fausse.Dans votre deuxième
if
:b
est évaluée en premier et mis au rebut,a
est évalué deuxième et retourné comme 1. Si cette condition est vraie.Si il y a plus de deux opérandes, la dernière expression sera retourné.
Si vous voulez les deux conditions pour être vrai, vous devez utiliser le && opérateur de:
if (numeric_read(str, &err), !err)
. Avais-je utilisé&& !err
au lieu de, !err
, je ne serais pas en mesure de lire les numéros qui ont été 0.Voici un exemple fourni par wikipedia, qui présente un autre cas d'utilisation:
La virgule peut être utilisé à l'intérieur d'un état (d'un if, while, do while, ou pour) pour permettre aux auxiliaires de calculs, en particulier l'appel d'une fonction et en utilisant le résultat, avec bloc de portée:
si (y = f(x), y > x) {
... //déclarations impliquant x et y
}
//Voir cette discussion Wikipédia
De nombreux programmeurs C ont rencontré la virgule dans l'initialiseur le cadre d'une instruction for,
mais pas comme beaucoup l'ont vu utilisé dans une instruction if.
Dans le cas ci-dessus, il vous permet d'initialiser y avant de l'instruction si les tests de la condition y>x.
if (y = f(x), y > x) {
,y = f(x)
est affectation, pas initialisation.