Здравствуйте, 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").
Здравствуйте, 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
КР>Не тебе запрещать варианты с 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;
}
Так на чем остановились-то?
С чем сравнивать bool-переменные или возвращаемые значения функций? С целыми константами?
или может создавать
enum { FALSE, TRUE };
?
не использовать никогда bool? почему? я не вижу причины, почему нельзя сравнить два булевских операнда — нет приведения ни к int, ни к чему другому...кто-то потом может поменять мой вызов bool isConditionTrue(); на int isAnotherConditionTrue();?
Так пусть перед этим посмотрит мой код — раз проследить за сравниваемыми значениями и все — пусть меняет все конструкции типа
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Roman Odaisky, Вы писали:
А>>так в чем проблема-то? че не ясно? CC>проблема в том, что г-н Roman Odaisky хочет продвинуть в массы свою идею о том, что с true нельзя сравнивать вообще ничего, даже bool CC>Риторический вопрос: зачем ему это надо? и почему он так упорствует в том что запись типа (<bool value> == true) — некорректна
Сравнивать c true или false это выбор индивидуальный. Никто не запрещает использовать конструкцию (<bool value> == true).
Здесь есть небольшая тонкость. С++ наследник языка С, к тому же тип bool появился в языке не сразу. В языке С было принято
что: значение равное нулю — ложь, значение не равное нулю — истина. true же константа равная 1 (одно значение из множества)
Запрет на сравнение c true своего рода правило хорошего программирования, оно снижает вероятность появления ошибки.
Здравствуйте, Roman Odaisky, Вы писали:
RO>риторический вопрос: а зачем так?
RO>Потом другой программер поменяет вызов bool myHandmadeTest(...) на int someOutoftheboxApiFunctionThatSeeminglyDoesTheSame(...). В лучшем случае получим ворнинг, в худшем — 1000 ворнингов. Или кто-то поменяет true на TRUE, тогда (еще хуже) их вообще не будет.
RO>P. S. Вот передо мной проект на 0,4 MLOC. Запустил поиск по /[=!]=\s*<true>/i. Найдено 1 (одно) совпадение в своем коде (ай-ай-ай... теперь уже ни одного) + 7 в сторонних библиотеках. Аналогичный поиск по false дает 29 совпадений (17 + 12). Какой вообще смысл явно сравнивать с логическими константами?
Вопрос не в этом. Я тоже никогда не пишу ... == true
Но так упорно утверждать что "Низзя сравнивать с true!!!" я не стану.
А также утверждать что надо писать так-то и так-то потому что "это снижает вероятность ошибки" — пардон, это по мне так паранойя
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[3]: Откуда берутся true и false?
От:
Аноним
Дата:
16.08.06 12:14
Оценка:
RO>>Низзя сравнивать с true!!!
КР> Кто запретил? Давно запрет вышел?
RO>>А если var имеет тип int и равняется 2?
КР> Компилятор варнинг кинет
Здравствуйте, Аноним, Вы писали:
RO>>>Низзя сравнивать с true!!!
КР>> Кто запретил? Давно запрет вышел?
RO>>>А если var имеет тип int и равняется 2?
КР>> Компилятор варнинг кинет
А>А откуда компилятор знает что var равняется 2?
Компилятору это знать не надо
Он бросит ворнинг при сравнении типа bool c другим типом (int char short etc)
Здравствуйте, Аноним, Вы писали:
А>Пожалуй я вмешаюсь, так как не могу смотреть на это безобразие....
А>тип 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.
Недавнее сообщение в форуме "Коллеги, улыбнитесь" спровоцировало диалог, местами переходивший в holy war.
В ходе обсуждения нерешённым остался вопрос о том, откуда соответствующая среда знает, что есть true и false.
Приведённый ниже код без проблем компилится в MS VS 2005, а в Borland C++ 3.1 выдаёт ошибку: " Undefined symbol 'true'"
Здравствуйте, CheckiSt, Вы писали:
CS>Недавнее сообщение в форуме "Коллеги, улыбнитесь" спровоцировало диалог..............
Вообще true, false являются ключевыми словами С++.
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
Пример считаю некорректным в принципе.
Написан чистый бред. Нахрена сравнивать 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[8]: Откуда берутся true и false?
От:
Аноним
Дата:
17.08.06 07:15
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:
<skip>
Пожалуй я вмешаюсь, так как не могу смотреть на это безобразие....
тип bool можно спокойно сравнивать как с true так и с false, на то он и bool.
тип int нельзя сравнивать как с true так и c false — это и ежу понятно.
Здравствуйте, 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, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Roman Odaisky, Вы писали:
RO>любой тип можно спокойно сравнивать с false, на то он и false.
true RO>любой тип нельзя (не рекомендуется) сравнивать с true — надеюсь, тоже понятно.
false
bool можно сравнивать с true
А>так в чем проблема-то? че не ясно?
проблема в том, что г-н Roman Odaisky хочет продвинуть в массы свою идею о том, что с true нельзя сравнивать вообще ничего, даже bool
Риторический вопрос: зачем ему это надо? и почему он так упорствует в том что запись типа (<bool value> == true) — некорректна
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>запись типа (<bool value> == true)
риторический вопрос: а зачем так?
Потом другой программер поменяет вызов bool myHandmadeTest(...) на int someOutoftheboxApiFunctionThatSeeminglyDoesTheSame(...). В лучшем случае получим ворнинг, в худшем — 1000 ворнингов. Или кто-то поменяет true на TRUE, тогда (еще хуже) их вообще не будет.
P. S. Вот передо мной проект на 0,4 MLOC. Запустил поиск по /[=!]=\s*<true>/i. Найдено 1 (одно) совпадение в своем коде (ай-ай-ай... теперь уже ни одного) + 7 в сторонних библиотеках. Аналогичный поиск по false дает 29 совпадений (17 + 12). Какой вообще смысл явно сравнивать с логическими константами?
Здравствуйте, CreatorCray, Вы писали:
RO>>В <locale> определен такой isalnum, как ты сказал. Заметь, второй параметр не имеет дефолтного значения. А как же, по-твоему, пишут В <cctype> определен int isalnum(int) ...the same as the Standard C library headers <ctype.h>... (21.4).
CC>...который не находится в namespace std. Соответственно к std::isalnum не имеет никакого отношения. CC>Дальнейшее написанное от этого теряет всякий смысл.
RTFM
Except as noted in clauses 18 through 27, the contents of each header cname shall be the same as that of the corresponding header name.h, as specified in ISO/IEC 9899:1990 Programming Languages C (Clause 7), or ISO/IEC:1990 Programming Languages—C AMENDMENT 1: C Integrity, (Clause 7), as appropriate, as if by inclusion. In the C++ Standard Library, however, the declarations and definitions (except for names which are defined as macros in C) are within namespace scope (3.3.5) of the namespace std.
160) The ".h" headers dump all their names into the global namespace, whereas the newer forms keep their names in namespace std. Therefore, the newer forms are the preferred forms for all uses except for C++ programs which are intended to be strictly compatible with C.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, CreatorCray, Вы писали:
RO>>>В <locale> определен такой isalnum, как ты сказал. Заметь, второй параметр не имеет дефолтного значения. А как же, по-твоему, пишут В <cctype> определен int isalnum(int) ...the same as the Standard C library headers <ctype.h>... (21.4). RO>RTFM
Ок. Убедил. Для <cctype> — верно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, omka, Вы писали:
O>Так на чем остановились-то? O>С чем сравнивать bool-переменные или возвращаемые значения функций? С целыми константами? O>или может создавать O>
O>enum { FALSE, TRUE };
O>
O>?
да ни с чем... if(var), if(!var), if(!x && (y || z)).
O>не использовать никогда bool? почему? я не вижу причины, почему нельзя сравнить два булевских операнда — нет приведения ни к int, ни к чему другому...кто-то потом может поменять мой вызов bool isConditionTrue(); на int isAnotherConditionTrue();?
А это и в самом деле очень интересный вопрос... Можно ли писать if(f() == g()), если обе они логические, т. е., скорее всего, bool, но могут оказаться и int? Смысл так писать вроде есть:
O>Так пусть перед этим посмотрит мой код — раз проследить за сравниваемыми значениями и все — пусть меняет все конструкции типа
Ну это тяжко... А когда в C++09 мы будем писать
auto value = objectX.hasPropertyY(); // bool?
или когда чересчур умные шаблоны протащат int чересчур далеко, то создадим себе еще больше проблем...
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Roman Odaisky, Вы писали:
RO>>Здравствуйте, CreatorCray, Вы писали:
RO>>>>В <locale> определен такой isalnum, как ты сказал. Заметь, второй параметр не имеет дефолтного значения. А как же, по-твоему, пишут В <cctype> определен int isalnum(int) ...the same as the Standard C library headers <ctype.h>... (21.4). RO>>RTFM CC>Ок. Убедил. Для <cctype> — верно.
Это верно и для ctype.h. Недавно это обсуждали. Подробности здесь