2017-04-16 1 views
1

Mon affirmation ne fonctionne tout simplement pas.Assert ne fonctionne pas

int tspace::Tpiz::set_pitPoz(int p) 
{ 
    assert (0<=p<=11); 
    pitPoz = p; 
} 

En principal:

Tpiz piz; 
piz.set_pitPoz(78); 
cout << piz.get_pitPoz(); 

La sortie est:

 
78 
- - - - - - - - - - - - - - 
Process exited after 0.03378 seconds with return value 0 
Press any key to continue 

Y at-il autre chose que je dois faire?

+5

'0 <= p <= 11' ne signifie pas ce que vous pensez que cela signifie. – user2357112

+0

Oh. Que signifie mon code? – jana

+0

Si vous voulez vous assurer que les expressions sont correctement évaluées, commencez toujours par les utiliser dans un format facile à tester. '(0 <= p) et (p <= 11)' comme expression. Il n'y a aucune confusion à d'autres personnes ou au compilateur exactement ce que vous voulez dire? Vous pouvez toujours l'optimiser plus tard si vous pensez que cela en vaut la peine? –

Répondre

3

L'expression 0<=p<=11 évalue probablement 0<=p, ce qui donne un bool, mais il essaie d'impliquer cette bool dans une comparaison contre 11, qui est un entier, il favorise la bool à int, (0 ou 1), et vérifie ensuite si ce 0 ou 1 est inférieur ou égal à 11. Donc, il réussira toujours.

Vous pourrez peut-être éviter de tels accidents stupides en autorisant plus d'avertissements, de sorte que le compilateur vous avertira que vous êtes susceptible de faire quelque chose de mal. Essayez -Wall, ou quoi que ce soit qui dit à votre compilateur d'activer tous les avertissements. Vous ne pouvez pas essayer d'écrire un logiciel sans que de nombreux, de préférence la plupart, soient activés.

+0

Merci, je vais chercher à activer tous les avertissements. – jana

+0

stupide? il n'y a pas besoin d'appeler un nom. En fait, étant donné que x <= y <= z compile encore, quelque chose de complètement non intuitif montre qu'il s'agit plus d'un «bug subtil», et non d'un «accident stupide». – SCFrench

+0

@SCFrench J'ai appelé l'accident stupide, pas l'OP. –