--
С уважением, Александр Яковлев.
---OUTLOK
+ Origin: Ayaks a_n...@ton.net.ru
> конкpетно число 204, но сpавнение А==true, давало положительный pезультат.
В
Ну, правильно: 204 - это ж не ноль, значит true, а true == true будет true
> дело, как избежать подобных ошидок?
Ты же сам и ответил на свой вопрос - инициализировать переменные
> VS 8.0 2005 года.
Вышеописанная ситуация - вполне штатная для языка, а значит
любой вменямый компилятор будет себя вести точно так же
AY> Была у меня не инициализиpованная пеpеменная А типа bool, и была в ней
AY> гpязь, конкpетно число 204, но сpавнение А==true, давало положительный
AY> pезультат. В чем дело, как избежать подобных ошидок?
Инициализировать свои переменные.
С приветом, Шурик Гребеньков. e-mail: grebenkov [не собака] gmail dot com
P.S. false == 0, true != 0 - по определению
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 (минусы убрать)
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> Вменяемый компилятор, как раз, обязан сравнивать "как есть".
Страуструп врёт?
27 Jun 07 14:39, you wrote to me:
AG> Угадай, откуда цитата?
А по фигу, откуда. Главное, что не из стандарта.
EM>> Вменяемый компилятор, как раз, обязан сравнивать "как есть".
AG> Страуструп врёт?
Просто фантазирует. Кому нужен компилятор, который станет дополнительно
преобразовывать значения собственных же специальных типов перед каждым
сравнением?
Кстати, помимо компиляторов от MS, BCC и любимый народом в качестве
иллюстратора стандарта gcc сравнивают точно так же - напрямую. И правильно
делают, иначе бы засмеяли давно.
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).
27 Jun 07 22:57, you wrote to me:
EM>> Кому нужен компилятор, который станет дополнительно преобразовывать
EM>> значения собственных же специальных типов перед каждым сравнением?
AG> А куда он денется? Однобитных регистров - пока что в процессоре нет.
Как уже говорилось, наиболее популярные компиляторы куда-то деваются, не делая
никаких преобразований, и поступая совершенно правильно :) Как ведут себя
непопулярные - не знаю, не пробовал.
AG> Когда в коде написано:
AG> if (207 == true)...
AG> компилятор может поступить тремя способами:
Когда в коде написано _так_ - может. В обсуждаемом случае в коде написано
_не_так_.
Ты точно не путаешь bool и BOOL?
С уважением,
Геннадий Майко.
28 Jun 07 12:34, you wrote to me:
GM> Well, в "relational-expressions" и "relational operators", участвующих
GM> в операциях сравнения
Ты не забывай разницу между relational operators и equality operators.
28 Jun 07 11:17, you wrote to me:
AA> Ты точно не путаешь bool и BOOL?
Я, в отличие от некоторых :), еще и не поленился посмотреть на код,
генерируемый всеми упомянутыми компиляторами :)
EM> Ты не забывай разницу между relational operators и equality operators.
--
А там разница всего в "lower precedence and truth-value result". Первое в
обсуждаемом вопросе особо не интересно, а для получения второго как раз и
нужно делать эти самые "usual arithmetic conversions".
C уважением,
Геннадий Майко.
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 не являются ни арифметическими, ни перечислимыми.
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 уважением,
Геннадий Майко.