2012-11-03 6 views
6

Possible en double:
why does 3,758,096,384 << 1 gives 768C++ Que veut dire 'int x = (anyInt1, anyInt2);' signifier?

Aujourd'hui, je trouve que le code suivant compile avec gcc:

#include <iostream> 

int main() 
{ 
    int x = (23,34); 

    std::cout << x << std::endl; // prints 34 

    return 0; 
} 

Pourquoi cette compile? Quel est le sens de (..., ...)?

+1

Bien sûr, la signification réelle est que certains smart ass ont utilisé l'opérateur virgule, ce qui est très rarement justifié. – Yakk

Répondre

8

En C++, , est un opérateur, et donc (23,34) est une expression comme (23+34) est une expression. Dans le premier, , est un opérateur, tandis que dans le dernier, + est un opérateur. Donc l'expression (23,34) évalue à l'opérande le plus à droite qui est 34, c'est pourquoi votre code sort 34.

Je voudrais aussi mentionner que , n'est pas un opérateur dans un appel de fonction:

int m = max(a,b); 

Ici , agit un séparateur d'arguments. Il n'agit pas en tant qu'opérateur. Donc, vous passez deux arguments à la fonction.

Cependant,

int m = max((a,b), c); 

Ici premier , est un opérateur, et le second est , un séparateur. Donc, vous passez encore deux arguments à la fonction, pas trois, et c'est équivalent à ceci:

int m = max(b, c); //as (a,b) evaluates to b 

Hope that helps. :-)

+3

Une petite note sur le rôle parenthèse dans cet exemple serait utile car, l'opérateur a une priorité inférieure alors = opérateur. int x = 23,34; ne compilerait pas du tout. – Tomek

+0

@Tomek: Bon point. Merci. J'espère que les lecteurs verront votre commentaire aussi. – Nawaz

+1

Ceci est également vrai pour C. –

14

Dans une expression, l'opérateur de virgule évaluera tous ses opérandes et retournera le dernier. Voilà pourquoi dans votre exemple, x est égal à 34.

+0

Et les parenthèses sont exactement comme lorsqu'elles sont utilisées dans des phrases, par exemple, pour grouper des instructions. – mrbrdo

+0

Ah, oui. J'ai oublié qu'il y a un opérateur virgule en C++. thx – pwks