Можно ли предположить (bool) true == (int) 1 для любого компилятора C ++? - PullRequest
109 голосов
/ 28 апреля 2010

Можно ли предположить (bool)true == (int)1 для любого компилятора C ++?

Ответы [ 5 ]

127 голосов
/ 28 апреля 2010

Да. Слепки излишни. В вашем выражении:

true == 1

Действует интегральная акция, и значение bool будет повышено до int, и эта акция должна давать 1.

Ссылка: 4.7 [conv.integral] / 4: Если тип источника bool ... true, преобразуется в единицу.

18 голосов
/ 28 апреля 2010

Ответ Чарльза Бейли правильный. Точная формулировка из стандарта C ++ (§4.7 / 4): «Если тип источника - bool, значение false преобразуется в ноль, а значение true преобразуется в единицу».

Редактировать: Я вижу, что он также добавил ссылку - я скоро ее удалю, если не отвлекусь и не забуду ...

Edit2: Опять же, вероятно, стоит отметить, что, хотя сами булевы значения всегда преобразуются в ноль или единицу, ряд функций (особенно из стандартной библиотеки C) возвращают значения, которые "в основном булевы", но представлены int s, которые обычно должны быть только нулем, чтобы указывать ложь, или ненулем, чтобы указывать истину. Например, для функций is * в <ctype.h> требуется только ноль или ненулевое значение, необязательно ноль или единица.

Если вы приведете это значение к bool, ноль преобразуется в ложь, а ненулевое в истину (как и следовало ожидать).

7 голосов
/ 28 апреля 2010

Согласно стандарту, вы должны быть в безопасности с этим предположением. Тип C ++ bool имеет два значения - true и false с соответствующими значениями 1 и 0.

Нужно следить за тем, чтобы смешивать bool выражения и переменные с BOOL выражением и переменными. Последний определяется как FALSE = 0 и TRUE != FALSE, что на практике довольно часто означает, что любое значение, отличное от 0, считается TRUE.

Многие современные компиляторы фактически выдают предупреждение для любого кода, который неявно пытается привести от BOOL к bool, если значение BOOL отличается от 0 или 1.

4 голосов
/ 28 апреля 2010

Я обнаружил, что разные компиляторы возвращают разные результаты в true. Я также обнаружил, что почти всегда лучше сравнивать bool с bool вместо int. Эти целочисленные значения имеют тенденцию изменять значение с течением времени по мере развития вашей программы, и если вы примете значение true равным 1, вы можете быть укушены несвязанным изменением в другом месте вашего кода.

0 голосов
/ 28 апреля 2010

Нет, TRUE может быть произвольным среди компиляторов. Некоторые будут использовать 1, некоторые -1 (все биты установлены, знаковая переменная), другие компиляторы могут использовать другое значение. Даже если значение стандартизировано, не все компиляторы могут следовать стандарту.

FALSE, однако, это когда все биты очищены, что происходит только для числового значения 0.

...