Могу ли я предположить (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) возвращают значения, которые "в основном булевы", но представлены как ints, которые обычно должны быть только нулем, чтобы указывать ложь, или ненулем, чтобы указывать истину. Например, функции 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.

Другие вопросы по тегам