2010-01-28 5 views
1

Je viens de croiser un morceau de code qui compile non seulement, mais donne le résultat attendu (où x est une valeur entière):Vous pensez donc connaître la priorité des opérateurs en C++?

int y = (int)(0.5 * x * x + + + 0.6 * x + 1.2); 

Il m'a fallu un certain temps pour comprendre ce qui se passe et je dois dire c'était un problème d'opérateur intéressant. Sans compiler le programme, quels sont les résultats des opérations suivantes et pourquoi?

int a = 1; 
int b = 2; 
int z = a + + + b; 
int z1 = a + - + b; 
int z2 = a + - - b; 
int z3 = a - - + b; 
int z4 = a - - - b; 
int z5 = a +- b; 

J'ai encore une question, cependant: la norme donne-t-elle de tels résultats ou est-elle spécifique au compilateur?


Explication: Parce que + et - les opérateurs ont des espaces entre eux, la séquence « + + + » n'est pas compilé comme « ++ + », mais que les opérateurs unaires sur le membre droit. Alors

int y = (int)(0.5 * x * x + + + 0.6 * x + 1.2); 

donne en fait:

int y = (int)(0.5 * x * x + 0.6 * x + 1.2); 

qui était le résultat attendu.

Ainsi,

z = a + + + b = a + + (+b) = a + (+b) = a + b = 3; 
z1 = a + - + b = a + - (+b) = a + (-b) = a - b = -1; 
z2 = a + - - b = a + - (-b) = a + (+b) = a + b = 3; 
z3 = a - - + b = a - - (+b) = a - (-b) = a + b = 3; 
z4 = a - - - b = a - - (-b) = a - (+b) = a - b = -1; 
z5 = a +- b = a + (-b) = a - b = -1; 
+5

Donne le "résultat attendu"? Est-ce qu'il imprime une information à l'écran en disant "Qui compile, mais je ne sais pas pourquoi vous le voudriez"? C'est ce à quoi je m'attendrais. –

+13

Pas vraiment intéressé par les quiz de codage artificiels, merci. –

+2

Si le résultat était vraiment attendu, vous ne poseriez pas cette question. –

Répondre

2

z = 3
z1 = -1
z2 = 3
z4 = 3
Z5 = -1

Sans compilation, je dirais qu'il est un opérateur mathématique simple combinant
Je l'ai appris avec cette expression (traduit du portugais brésilien):

Différents signes = Soustraire
signe égal = ajouter

Alors

int z = a + + + b; // '+' + '+' = '+' , the resulting '+' + '+' = + again. 
int z1 = a + - + b; // '+' + '-' = '-' , the resulting '-' + '+' = - again. 
int z2 = a + - - b; // '+' + '-' = '-' , the resulting '-' + '-' = +. 
int z3 = a - - + b; // '-' + '-' = '+' , the resulting '+' + '+' = + again. 
int z4 = a - - - b; // '-' + '-' = '+' , the resulting '+' + '-' = -. 
int z5 = a +- b; //simple "different signals = subtract" :) 
+0

compilé maintenant, et c'est vraiment ça. :) – Marcelo

20

Répondant à la question telle qu'elle est formulée dans le titre:

Vous pensez que vous connaissez la priorité opérateurs en C++?

Non, je ne pense pas, et même plus, je n'ai pas l'intention de l'apprendre. Chaque fois que je ne sais pas quand je lis, je vérifie la documentation, chaque fois que je ne sais pas quand j'écris, je vais utiliser des parenthèses. J'ai besoin de ma mémoire pour me souvenir de choses plus importantes.

+1

Dans le monde réel, tous les quiz sont open-book. (Ou, comme disait l'un de mes professeurs, "open-neighbour.") –

+0

Plus d'une fois, en lisant, je pensais savoir, mais en fait je n'ai pas raté le bug que quelqu'un d'autre a fait. Donc je préfère savoir ... –

+1

Sans parler de ça, si j'apprends la priorité, je vais m'en fier un jour. Soit je vais me tromper (ma mémoire n'est pas aussi bonne que je me le rappelle), soit je vais confondre quelqu'un d'autre. Je peux toujours le chercher. –

4

[source] Unaire +/- lier plus serré que l'addition/soustraction +/-, et associer droit. Ainsi ...

int a = 1; 
int b = 2; 
int z = a + + + b; // equivalent to a + (+(+b)) 
int z1 = a + - + b; // equivalent to a + (-(+b)) 
int z2 = a + - - b; // equivalent to a + (-(-b)) = a + b 
int z3 = a - - + b; // equivalent to a - (-(+b)) = a + b 
int z4 = a - - - b; // equivalent to a - (-(-b)) = a - b 
int z5 = a +- b; // equivalent to a + (-b) = a - b 
2

Pour répondre à votre question, les réponses ne sont pas spécifiques au compilateur. Ce n'est ni un comportement défini par l'implémentation ni un comportement indéfini.