Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Hе инициализиpованная пеpеменная типа bool.

1 view
Skip to first unread message

Aleksandr Yakovlev

unread,
Jun 25, 2007, 11:36:26 PM6/25/07
to
Была у меня не инициализиpованная пеpеменная А типа bool, и была в ней
гpязь,
конкpетно число 204, но сpавнение А==true, давало положительный pезультат. В
чем
дело, как избежать подобных ошидок? VS 8.0 2005 года.


--
С уважением, Александр Яковлев.
---OUTLOK
+ Origin: Ayaks a_n...@ton.net.ru


Sergei Andreev

unread,
Jun 26, 2007, 5:07:13 AM6/26/07
to
> Была у меня не инициализиpованная пеpеменная А типа bool, и была в ней
> гpязь,
Ну, правильно - она ж неинициализированная

> конкpетно число 204, но сpавнение А==true, давало положительный pезультат.
В

Ну, правильно: 204 - это ж не ноль, значит true, а true == true будет true

> дело, как избежать подобных ошидок?

Ты же сам и ответил на свой вопрос - инициализировать переменные

> VS 8.0 2005 года.
Вышеописанная ситуация - вполне штатная для языка, а значит
любой вменямый компилятор будет себя вести точно так же


Alexander Grebenkov

unread,
Jun 26, 2007, 3:23:36 AM6/26/07
to
Ура.

AY> Была у меня не инициализиpованная пеpеменная А типа bool, и была в ней
AY> гpязь, конкpетно число 204, но сpавнение А==true, давало положительный
AY> pезультат. В чем дело, как избежать подобных ошидок?

Инициализировать свои переменные.

С приветом, Шурик Гребеньков. e-mail: grebenkov [не собака] gmail dot com

P.S. false == 0, true != 0 - по определению

Eugene Muzychenko

unread,
Jun 27, 2007, 2:17:50 AM6/27/07
to
Привет!

26 Jun 07 13:07, you wrote to Aleksandr Yakovlev:

>> конкpетно число 204, но сpавнение А==true, давало положительный

>> pезультат.

SA> Hу, правильно: 204 - это ж не ноль, значит true, а true == true будет
SA> true

Hет, неправильно. Стандарт C++ не предусматривает преобразования типов при
выполнении операций сравнения над операндами типа bool. Если бы в указанной
ситуации действительно получалась истина - это был бы повод для рекламации на
компилятор.

SA> любой вменямый компилятор будет себя вести точно так же

Вменяемый компилятор, как раз, обязан сравнивать "как есть".

Всего доброго!
Евгений Музыченко
eu-...@muzy-chen-ko.net (минусы убрать)

Alexander Grebenkov

unread,
Jun 27, 2007, 5:39:06 AM6/27/07
to
Ура.

EM> Hет, неправильно. Стандарт C++ не предусматривает преобразования типов при
EM> выполнении операций сравнения над операндами типа bool. Если бы в
EM> указанной ситуации действительно получалась истина - это был бы повод для
EM> рекламации на компилятор.

---
By definition, true has the value 1 when converted to an integer and false has
the value 0. Conversely, integers can be implicitly converted to bool values:
nonzero integers convert to true and 0 converts to false. For example:

bool b = 7 ; // bool(7) is true, so b becomes true
int i = true ; // int(true) is 1, so i becomes 1

In arithmetic and logical expressions, bools are converted to ints; integer
arithmetic and logical operations are performed on the converted values. If the
result is converted back to bool, a 0 is converted to false and a nonzero value
is converted to true.
---

Угадай, откуда цитата?

SA>> любой вменямый компилятор будет себя вести точно так же

EM> Вменяемый компилятор, как раз, обязан сравнивать "как есть".

Страуструп врёт?

Eugene Muzychenko

unread,
Jun 27, 2007, 3:11:48 PM6/27/07
to
Привет!

27 Jun 07 14:39, you wrote to me:

AG> Угадай, откуда цитата?

А по фигу, откуда. Главное, что не из стандарта.

EM>> Вменяемый компилятор, как раз, обязан сравнивать "как есть".

AG> Страуструп врёт?

Просто фантазирует. Кому нужен компилятор, который станет дополнительно
преобразовывать значения собственных же специальных типов перед каждым
сравнением?

Кстати, помимо компиляторов от MS, BCC и любимый народом в качестве
иллюстратора стандарта gcc сравнивают точно так же - напрямую. И правильно
делают, иначе бы засмеяли давно.

Alexander Grebenkov

unread,
Jun 27, 2007, 1:57:38 PM6/27/07
to
Ура.

AG>> Угадай, откуда цитата?
EM> А по фигу, откуда. Главное, что не из стандарта.

Да вот мне почему-то кажется, что 3-е издание Страуструпа - оно должно быть к
этому стандарту очень близко.

EM>>> Вменяемый компилятор, как раз, обязан сравнивать "как есть".
AG>> Страуструп врёт?

EM> Просто фантазирует. Кому нужен компилятор, который станет
EM> дополнительно преобразовывать значения собственных же специальных
EM> типов перед каждым сравнением?

А куда он денется? Однобитных регистров - пока что в процессоре нет.

EM> Кстати, помимо компиляторов от MS, BCC и любимый народом в качестве
EM> иллюстратора стандарта gcc сравнивают точно так же - напрямую. И правильно
EM> делают, иначе бы засмеяли давно.

Когда в коде написано:

if (207 == true)...

компилятор может поступить тремя способами:
1. Отказаться сравнивать вообще, потому что типы разные.
2. Привести 207 к типу bool.
3. Привести bool к типу int.

Hикакого "как есть" быть не может. gcc поступает именно третьим способом, что
легко проверяется (он сравнивает 207 == 1).

Eugene Muzychenko

unread,
Jun 27, 2007, 10:53:35 PM6/27/07
to
Привет!

27 Jun 07 22:57, you wrote to me:

EM>> Кому нужен компилятор, который станет дополнительно преобразовывать
EM>> значения собственных же специальных типов перед каждым сравнением?

AG> А куда он денется? Однобитных регистров - пока что в процессоре нет.

Как уже говорилось, наиболее популярные компиляторы куда-то деваются, не делая
никаких преобразований, и поступая совершенно правильно :) Как ведут себя
непопулярные - не знаю, не пробовал.

AG> Когда в коде написано:
AG> if (207 == true)...
AG> компилятор может поступить тремя способами:

Когда в коде написано _так_ - может. В обсуждаемом случае в коде написано
_не_так_.

Alexander Andrusenko

unread,
Jun 28, 2007, 3:17:12 AM6/28/07
to
EM> Как уже говорилось, наиболее популярные компиляторы куда-то деваются,
EM> не делая никаких преобразований, и поступая совершенно правильно :) Как
EM> ведут себя непопулярные - не знаю, не пробовал.

Ты точно не путаешь bool и BOOL?


Gennady Mayko

unread,
Jun 28, 2007, 4:34:13 AM6/28/07
to
EM> Просто фантазирует. Кому нужен компилятор, который станет дополнительно
EM> преобразовывать значения собственных же специальных типов перед каждым
EM> сравнением?
--
Well, в "relational-expressions" и "relational operators", участвующих в
операциях сравнения, для арифметических типов используется "usual arithmetic
conversions", в свою очередь для которых "operands of type bool ... are
converted to some integral type".

С уважением,
Геннадий Майко.

Eugene Muzychenko

unread,
Jun 28, 2007, 7:21:38 AM6/28/07
to
Привет!

28 Jun 07 12:34, you wrote to me:

GM> Well, в "relational-expressions" и "relational operators", участвующих
GM> в операциях сравнения

Ты не забывай разницу между relational operators и equality operators.

Eugene Muzychenko

unread,
Jun 28, 2007, 7:19:22 AM6/28/07
to
Привет!

28 Jun 07 11:17, you wrote to me:

AA> Ты точно не путаешь bool и BOOL?

Я, в отличие от некоторых :), еще и не поленился посмотреть на код,
генерируемый всеми упомянутыми компиляторами :)

Gennady Mayko

unread,
Jun 28, 2007, 5:48:19 AM6/28/07
to
GM>> Well, в "relational-expressions" и "relational operators", участвующих
GM>> в операциях сравнения

EM> Ты не забывай разницу между relational operators и equality operators.
--
А там разница всего в "lower precedence and truth-value result". Первое в
обсуждаемом вопросе особо не интересно, а для получения второго как раз и
нужно делать эти самые "usual arithmetic conversions".

C уважением,
Геннадий Майко.

Eugene Muzychenko

unread,
Jun 28, 2007, 10:45:59 AM6/28/07
to
Привет!

28 Jun 07 13:48, you wrote to me:

EM>> Ты не забывай разницу между relational operators и equality

EM>> operators.

GM> А там разница всего в "lower precedence and truth-value result".

А, пардон, я немного не туда смотрел.

GM> Первое в обсуждаемом вопросе особо не интересно, а для получения
GM> второго как раз и нужно делать эти самые "usual arithmetic
GM> conversions".

The usual arithmetic conversions are performed on operands of arithmetic or
enumeration type.

Значения типа bool не являются ни арифметическими, ни перечислимыми.

Gennady Mayko

unread,
Jun 28, 2007, 9:24:59 AM6/28/07
to
GM>> Первое в обсуждаемом вопросе особо не интересно, а для получения
GM>> второго как раз и нужно делать эти самые "usual arithmetic
GM>> conversions".

EM> The usual arithmetic conversions are performed on operands of arithmetic
EM> or enumeration type.

EM> Значения типа bool не являются ни арифметическими, ни перечислимыми.
--
Ну да!

Начнем отсюда: "bool values behave as integral types. Values of type
bool participate in integral promotions (4.5)." и далее "Types bool, char,
wchar_t, and the signed and unsigned integer types are collectively called
integral types". Наконец: "Integral and floating types are collectively
called arithmetic types".

C уважением,
Геннадий Майко.

0 new messages