Могу ли я предположить (bool)true == (int)1 для любого компилятора C++?
Могу ли я предположить (bool)true == (int)1
для любого компилятора C++?
6 ответов
Да. Слепки излишни. В вашем выражении:
true == 1
Действует интегральное продвижение, и значение bool будет повышено до int
и это продвижение должно дать 1.
Ссылка: 4.7 [conv.integral] / 4: Если тип источника bool
... true
превращается в один.
Ответ Чарльза Бейли правильный. Точная формулировка из стандарта C++: (§4.7/4): "Если тип источника - bool, значение false преобразуется в ноль, а значение true преобразуется в единицу".
Редактировать: я вижу, что он добавил ссылку также - я удалю это в ближайшее время, если я не буду отвлекаться и забуду...
Edit2: Опять же, вероятно, стоит отметить, что, хотя сами булевы значения всегда преобразуются в ноль или единицу, ряд функций (особенно из стандартной библиотеки C) возвращают значения, которые "в основном булевы", но представлены как int
s, которые обычно должны быть только нулем, чтобы указывать ложь, или ненулем, чтобы указывать истину. Например, функции is* в <ctype.h>
требуется только ноль или не ноль, не обязательно ноль или единица.
Если вы приведете это к bool
, ноль преобразуется в ложь, а ненулевое в истину (как и следовало ожидать).
Согласно стандарту, вы должны быть в безопасности с этим предположением. C++ bool
тип имеет два значения - true
а также false
с соответствующими значениями 1 и 0.
За чем стоит следить, так это за микшированием bool
выражения и переменные с BOOL
выражение и переменные. Последний определяется как FALSE = 0
а также TRUE != FALSE
что на практике довольно часто означает, что любое значение, отличное от 0, считается TRUE
,
Многие современные компиляторы фактически выдают предупреждение для любого кода, который неявно пытается привести из BOOL
в bool
если BOOL
значение отличается от 0 или 1.
Я обнаружил, что разные компиляторы возвращают разные результаты на true. Я также обнаружил, что почти всегда лучше сравнивать bool с bool вместо int. Эти целые числа имеют тенденцию изменять значение с течением времени по мере развития вашей программы, и если вы примете значение true равным 1, вы можете получить укусы от несвязанных изменений в другом месте вашего кода.
Если я напишу код:
int a=true;
cout<<a;
Результатом будет:
1
Итак, да, вы можете предположить (bool)true == (int) 1
Нет, TRUE может быть произвольным среди компиляторов. Некоторые будут использовать 1, некоторые -1 (все биты установлены, знаковое var), другие компиляторы могут использовать другое значение. Даже если значение стандартизировано, не все компиляторы могут следовать стандарту.
FALSE, однако, когда все биты очищены, что происходит только для числового значения 0.