Я могу принять (bool) верный == (интервал) 1 для какого-либо компилятора C++?

Я могу принять (bool)true == (int)1 для какого-либо компилятора C++?

111
задан chema989 24 November 2016 в 17:25
поделиться

5 ответов

Да. Приведения являются избыточными. В вашем выражении:

true == 1

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

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

128
ответ дан 24 November 2019 в 03:05
поделиться

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

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

-9
ответ дан 3 July 2019 в 05:37
поделиться

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

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

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

8
ответ дан 24 November 2019 в 03:05
поделиться

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

3
ответ дан 24 November 2019 в 03:05
поделиться

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

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

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

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

18
ответ дан 24 November 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: