Откуда берутся true и false?
От: CheckiSt Россия  
Дата: 16.08.06 08:56
Оценка:
Недавнее сообщение в форуме "Коллеги, улыбнитесь" спровоцировало диалог, местами переходивший в holy war.
В ходе обсуждения нерешённым остался вопрос о том, откуда соответствующая среда знает, что есть true и false.

Приведённый ниже код без проблем компилится в MS VS 2005, а в Borland C++ 3.1 выдаёт ошибку: " Undefined symbol 'true'"

if ( var == true ) {}


Где написано, что такое true?
Re: Откуда берутся true и false?
От: KBH  
Дата: 16.08.06 09:02
Оценка: 3 (2)
Здравствуйте, CheckiSt, Вы писали:

CS>Недавнее сообщение в форуме "Коллеги, улыбнитесь" спровоцировало диалог, местами переходивший в holy war.

CS>В ходе обсуждения нерешённым остался вопрос о том, откуда соответствующая среда знает, что есть true и false.

CS>Приведённый ниже код без проблем компилится в MS VS 2005, а в Borland C++ 3.1 выдаёт ошибку: " Undefined symbol 'true'"


CS>
CS>if ( var == true ) {}
CS>


CS>Где написано, что такое true?



2.13.5 Boolean literals

boolean-literal:
false
true

1 The Boolean literals are the keywords false and true. Such literals have type bool. They are not lvalues.

Re: Откуда берутся true и false?
От: Какая разница Украина  
Дата: 16.08.06 09:11
Оценка: 2 (1) +1
Здравствуйте, CheckiSt, Вы писали:

CS>Приведённый ниже код без проблем компилится в MS VS 2005, а в Borland C++ 3.1 выдаёт ошибку: " Undefined symbol 'true'"


Тот раритет (Borland C++ 3.1 ) еще не поддерживал тип bool
!0xDEAD
Re: Откуда берутся true и false?
От: Roman Odaisky Украина  
Дата: 16.08.06 09:34
Оценка: +2 -2
Здравствуйте, CheckiSt, Вы писали:

CS>
if ( var == true ) {}

Низзя сравнивать с true!!! А если var имеет тип int и равняется 2?

if(var);
if(var != false);
До последнего не верил в пирамиду Лебедева.
Re[2]: Откуда берутся true и false?
От: Какая разница Украина  
Дата: 16.08.06 11:45
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, CheckiSt, Вы писали:


RO>Низзя сравнивать с true!!!


Кто запретил? Давно запрет вышел?

RO>А если var имеет тип int и равняется 2?


Компилятор варнинг кинет

RO>
RO>if(var);
RO>if(var != false);
RO>


Ну здесь я понял что запрет на сравнение с false не прошел
Кворума не хватило
С false сравнивать по прежнему можно
Ну слава богу успокоил
!0xDEAD
Re: Откуда берутся true и false?
От: omka Украина  
Дата: 16.08.06 12:06
Оценка:
Здравствуйте, CheckiSt, Вы писали:

CS>Недавнее сообщение в форуме "Коллеги, улыбнитесь" спровоцировало диалог..............


Вообще true, false являются ключевыми словами С++.
Re[3]: Откуда берутся true и false?
От: Аноним  
Дата: 16.08.06 12:14
Оценка: :)
RO>>Низзя сравнивать с true!!!

КР> Кто запретил? Давно запрет вышел?


RO>>А если var имеет тип int и равняется 2?


КР> Компилятор варнинг кинет


А откуда компилятор знает что var равняется 2?
Re[4]: Откуда берутся true и false?
От: Какая разница Украина  
Дата: 16.08.06 12:17
Оценка: +1
Здравствуйте, Аноним, Вы писали:

RO>>>Низзя сравнивать с true!!!


КР>> Кто запретил? Давно запрет вышел?


RO>>>А если var имеет тип int и равняется 2?


КР>> Компилятор варнинг кинет


А>А откуда компилятор знает что var равняется 2?


Компилятору это знать не надо
Он бросит ворнинг при сравнении типа bool c другим типом (int char short etc)
!0xDEAD
Re[5]: Откуда берутся true и false?
От: Аноним  
Дата: 16.08.06 13:05
Оценка:
А>>А откуда компилятор знает что var равняется 2?

КР>Компилятору это знать не надо

КР>Он бросит ворнинг при сравнении типа bool c другим типом (int char short etc)

Ага, значит бросит ворнинг, а ты его прочитаешь... И какие будут твои действия? Заменишь (var == true) на (var == 2) ?
Re[3]: Откуда берутся true и false?
От: Roman Odaisky Украина  
Дата: 16.08.06 13:15
Оценка: -1
Здравствуйте, Какая разница, Вы писали:

RO>>Низзя сравнивать с true!!!


КР> Кто запретил? Давно запрет вышел?


Я бы посмотрел, как ты сравниваешь результат std::isalnum с true.
До последнего не верил в пирамиду Лебедева.
Re[6]: Откуда берутся true и false?
От: Какая разница Украина  
Дата: 16.08.06 13:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>А откуда компилятор знает что var равняется 2?


КР>>Компилятору это знать не надо

КР>>Он бросит ворнинг при сравнении типа bool c другим типом (int char short etc)

А>Ага, значит бросит ворнинг, а ты его прочитаешь... И какие будут твои действия? Заменишь (var == true) на (var == 2) ?


Я никогда не буду сравнивать bool c другими типами
Но сравнивать bool на равенство(неравенство) c константами true или false я буду если это понадобится
Я только возразил на пост здесь
Автор: Roman Odaisky
Дата: 16.08.06

в котором категорично запрещают сравнивать c true
Если внимательно прочитать исходный пост то var подразумевается там булевского типа и флейм
начатый Roman Odaisky и подхваченный тобой уводит нас от сути вопроса

Еще раз повторяю если bool var то сравнивать я могу как хочу


if (var)

if (var == true)

if (var != false)

if (var == !false)


Это мое личное дело
!0xDEAD
Re[4]: Откуда берутся true и false?
От: Какая разница Украина  
Дата: 16.08.06 13:34
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Какая разница, Вы писали:


RO>>>Низзя сравнивать с true!!!


КР>> Кто запретил? Давно запрет вышел?


RO>Я бы посмотрел, как ты сравниваешь результат std::isalnum с true.


Я уже Анониму ответил и тебе отвечу

В зависимости от настроения могу написать как угодно


if (std::isalnum(...))
if (std::isalnum(...) == true)
if (std::isalnum(...) != false)
if (std::isalnum(...) == !false)


Не тебе запрещать варианты с 2 по 4
Я доверяю оптимизирующим компиляторам
По крайней мере сейчас у них хватает ума чтобы все эти варианты свести к 1
!0xDEAD
Re[5]: Откуда берутся true и false?
От: Какая разница Украина  
Дата: 16.08.06 13:41
Оценка:
Здравствуйте, Какая разница, Вы писали:
КР>В зависимости от настроения могу написать как угодно


КР>
КР>if (std::isalnum(...))
КР>if (std::isalnum(...) == true)
КР>if (std::isalnum(...) != false)
КР>if (std::isalnum(...) == !false)
КР>


сорри забыл еще один вариант


if (std::isalnum(...) != !true)


о и еще куча вариантов


if (!std::isalnum(...) == false)
if (!std::isalnum(...) == !true)

и т д
!0xDEAD
Re[6]: Откуда берутся true и false?
От: KBH  
Дата: 16.08.06 13:45
Оценка: :)
Здравствуйте, Какая разница, Вы писали:

КР>и т д


Остапа несло...
Не в обиду
Re[5]: Откуда берутся true и false?
От: Roman Odaisky Украина  
Дата: 16.08.06 14:02
Оценка: -2
Здравствуйте, Какая разница, Вы писали:

КР>В зависимости от настроения могу написать как угодно


КР>
КР>if (std::isalnum(...))
КР>if (std::isalnum(...) == true)
КР>if (std::isalnum(...) != false)
КР>if (std::isalnum(...) == !false)
КР>

КР>Не тебе запрещать варианты с 2 по 4
КР>Я доверяю оптимизирующим компиляторам
КР>По крайней мере сейчас у них хватает ума чтобы все эти варианты свести к 1

нет

#include <iostream>
#include <cctype>

int my_isalnum(int c) // эта функция полностью соответствует стандартам C99 (п. 7.4.1.1) и C++03!
{
    return std::isalnum(c) ? 123 : 0;
}

bool bad_isalnum(char c)
{
    return my_isalnum(c) == true;
}

int main()
{
    std::cout << std::boolalpha << bad_isalnum('w') << std::endl;
}

MinGW 3.4.2: false
VC 8: false
VC 7.1: false
До последнего не верил в пирамиду Лебедева.
Re[6]: Откуда берутся true и false?
От: CreatorCray  
Дата: 16.08.06 14:16
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>нет


RO>
RO>#include <iostream>
RO>#include <cctype>

RO>int my_isalnum(int c) // эта функция полностью соответствует стандартам C99 (п. 7.4.1.1) и C++03!
RO>{
RO>    return std::isalnum(c) ? 123 : 0;
RO>}

RO>bool bad_isalnum(char c)
RO>{
RO>    return my_isalnum(c) == true;
RO>}

RO>int main()
RO>{
RO>    std::cout << std::boolalpha << bad_isalnum('w') << std::endl;
RO>}
RO>

RO>
RO>MinGW 3.4.2: false
RO>VC 8: false
RO>VC 7.1: false
RO>


Пример считаю некорректным в принципе.
Написан чистый бред. Нахрена сравнивать int с bool? Ты еще string с float посравнивай!

Речь шла про std::isalnum, и он определен как template<class _Elem> inline bool (isalnum)(_Elem _Ch, const locale& _Loc)
И этот возвращаемый bool можно сравнивать как с true так и с false. И это будет всегда корректно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[7]: Откуда берутся true и false?
От: Roman Odaisky Украина  
Дата: 16.08.06 16:48
Оценка: 22 (6)
Здравствуйте, CreatorCray, Вы писали:

CC>Пример считаю некорректным в принципе.

CC>Написан чистый бред. Нахрена сравнивать int с bool? Ты еще string с float посравнивай!

CC>Речь шла про std::isalnum, и он определен как template<class _Elem> inline bool (isalnum)(_Elem _Ch, const locale& _Loc)

CC>И этот возвращаемый bool можно сравнивать как с true так и с false. И это будет всегда корректно.

В <locale> определен такой isalnum, как ты сказал. Заметь, второй параметр не имеет дефолтного значения. А как же, по-твоему, пишут std::isalnum(c)? В <cctype> определен int isalnum(int) ...the same as the Standard C library headers <ctype.h>... (21.4). Что же говорит C99:

7.4.1 Character classification functions
1 The functions in this subclause return nonzero (true) if and only if the value of the
argument c conforms to that in the description of the function.
7.4.1.1 The isalnum function
Synopsis
1 #include <ctype.h>
int isalnum(int c);
Description
2 The isalnum function tests for any character for which isalpha or isdigit is true.


Выделено мной. Т. е. typeid(std::isalnum('s')) == typeid(int), это раз, и два, он может вернуть вовсе и не (int)true (может, какая-то реализация для скорости возвращает сам символ), лишь бы не 0.

Таких функций много, POSIX и WinAPI направо и налево возвращают int в логических функциях. Потому можно считать хорошей практикой с true никогда не сравнивать. Обрати внимание на то, как сформулирован стандарт в той части, где идет речь о пользовательских предикатах. Например, 25.2.12/5:

Returns: An iterator i such that for any iterator j in the range [first, i), pred(*j) != false,
and for any iterator k in the range [i, last), pred(*j) == false. The relative order of the
elements in both groups is preserved.


Подытожу: Гайдлайн: Никогда не сравнивайте логические значения с true. Польза нулевая, а раз в столетие что-то может хорошо полететь. Или переходите на # и пишите сразу if(val.ToString().ToUpper() == "TRUE").
До последнего не верил в пирамиду Лебедева.
Re[8]: Откуда берутся true и false?
От: Аноним  
Дата: 17.08.06 07:15
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

<skip>

Пожалуй я вмешаюсь, так как не могу смотреть на это безобразие....

тип bool можно спокойно сравнивать как с true так и с false, на то он и bool.
тип int нельзя сравнивать как с true так и c false — это и ежу понятно.

так в чем проблема-то? че не ясно?
Re[9]: Откуда берутся true и false?
От: Roman Odaisky Украина  
Дата: 17.08.06 08:04
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Пожалуй я вмешаюсь, так как не могу смотреть на это безобразие....


А>тип bool можно спокойно сравнивать как с true так и с false, на то он и bool.

А>тип int нельзя сравнивать как с true так и c false — это и ежу понятно.

А>так в чем проблема-то? че не ясно?


любой тип можно спокойно сравнивать с false, на то он и false.
любой тип нельзя (не рекомендуется) сравнивать с true — надеюсь, тоже понятно.

Cмысл явно указывать '== true'?

4.5/4

An rvalue of type bool can be converted to an rvalue of type int, with false becoming zero and true
becoming one.

До последнего не верил в пирамиду Лебедева.
Re[8]: Откуда берутся true и false?
От: CreatorCray  
Дата: 18.08.06 05:53
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>В <locale> определен такой isalnum, как ты сказал. Заметь, второй параметр не имеет дефолтного значения. А как же, по-твоему, пишут В <cctype> определен int isalnum(int) ...the same as the Standard C library headers <ctype.h>... (21.4).

...который не находится в namespace std. Соответственно к std::isalnum не имеет никакого отношения.
Дальнейшее написанное от этого теряет всякий смысл.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.