Недавнее сообщение в форуме "Коллеги, улыбнитесь" спровоцировало диалог, местами переходивший в holy war.
В ходе обсуждения нерешённым остался вопрос о том, откуда соответствующая среда знает, что есть true и false.
Приведённый ниже код без проблем компилится в MS VS 2005, а в Borland C++ 3.1 выдаёт ошибку: " Undefined symbol 'true'"
Здравствуйте, 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.
Здравствуйте, CheckiSt, Вы писали:
CS>Приведённый ниже код без проблем компилится в MS VS 2005, а в Borland C++ 3.1 выдаёт ошибку: " Undefined symbol 'true'"
Тот раритет (Borland C++ 3.1 ) еще не поддерживал тип bool
Здравствуйте, Аноним, Вы писали:
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) ?
Здравствуйте, Аноним, Вы писали:
А>>>А откуда компилятор знает что var равняется 2?
КР>>Компилятору это знать не надо КР>>Он бросит ворнинг при сравнении типа bool c другим типом (int char short etc)
А>Ага, значит бросит ворнинг, а ты его прочитаешь... И какие будут твои действия? Заменишь (var == true) на (var == 2) ?
Я никогда не буду сравнивать bool c другими типами
Но сравнивать bool на равенство(неравенство) c константами true или false я буду если это понадобится
Я только возразил на пост здесь
в котором категорично запрещают сравнивать c true
Если внимательно прочитать исходный пост то var подразумевается там булевского типа и флейм
начатый Roman Odaisky и подхваченный тобой уводит нас от сути вопроса
Еще раз повторяю если bool var то сравнивать я могу как хочу
if (var)
if (var == true)
if (var != false)
if (var == !false)
Здравствуйте, 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
КР>Не тебе запрещать варианты с 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;
}
Пример считаю некорректным в принципе.
Написан чистый бред. Нахрена сравнивать 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, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, 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 — это и ежу понятно.
Здравствуйте, Аноним, Вы писали:
А>Пожалуй я вмешаюсь, так как не могу смотреть на это безобразие....
А>тип 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.
Здравствуйте, 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, значит пора закрыть эту страницу.
Всем пока