69 votes

Pourquoi bool et pas bool fois retournent true dans ce cas ?

C'est mon code:

#include <cstring>
#include <iostream>
int main() {
    bool a;
    memset(&a, 0x03, sizeof(bool));
    if (a) {
        std::cout << "a is true!" << std::endl;
    }
    if (!a) {
        std::cout << "!a is true!" << std::endl;
    }
}

C'sorties:

a is true!
!a is true!

Il semble que l' ! (opérateur) bool seulement inverse de la dernière peu, mais chaque valeur n'est pas égale à 0 est considérée comme true. Cela conduit à un comportement, qui est logiquement faux. Est qu'un défaut dans la mise en œuvre, ou la spécification de l'autoriser? Notez que l' memset peut être omis, et le comportement serait probablement être le même parce que l' a contient de la mémoire des ordures.

Je suis sur gcc 4.4.5, d'autres compilateurs peut le faire différemment.

92voto

David Heffernan Points 292687

La norme (3.9.1/6 types Fondamentaux) dit:

Les valeurs de type bool sont vraies ou fausses.

....

À l'aide d'une valeur booléenne dans le sens décrit par la présente Norme Internationale comme "undefined", tels que par l'examen de la valeur d'un non initialisée automatique d'objets, peut pousser à se comporter comme si il n'est ni vrai ni faux.

Votre utilisation du programme de memset conduit à un comportement indéterminé. La conséquence pourrait être que la valeur n'est ni vrai ni faux.

41voto

Mike Seymour Points 130519

Il n’est pas « logiquement mauvais », c’est indéfini de comportement. est seulement censés pour contenir l’une des deux valeurs, ou . Lui assignant une valeur provoquera une conversion à une des valeurs suivantes. Briser la sécurité de type en écrivant une valeur octets arbitraires sur le dessus de sa mémoire (ou, comme vous le mentionnez, laissant unintialised) ne sera pas, donc vous pourriez bien vous retrouver avec une valeur qui n’est ni ni `` .

4voto

MrZebra Points 6508

À l’interne qu’il utilise probablement une opération not ( `` opérateur) pour l’inverser, qui fonctionnent lorsque le bool était soit zéro, soit tous ceux :

Cependant si vous le réglez à trois :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X