24>Скорее всего, потому что char* -> bool — "встроенное" преобразование, а char* -> std::string — пользовательское.
Если говорить в терминах, то char* в bool — это так называемое boolean conversion (4.12), а char* в std::string — вызов пользовательского преобразования, conversion by constructor. У первого приоритет выше.
Здравствуйте, 24, Вы писали:
24>Здравствуйте, Ytz, Вы писали:
Ytz>>Поясните почему char* приводиться к bool:
24>Скорее всего, потому что char* -> bool — "встроенное" преобразование, а char* -> std::string — пользовательское.
Но если вместо bool, например, поставить int, то приведения не будет, а будет вызов конструктора std::string
в C любое арифметическое выражение преобразуется в int
в виде 0 или 1 если находится в if while for
указатели целые вещественные без разницы все в int
так было в ANSI C как в C99 незнаю то что в
C++ указатель к int нельзя неявно привести а к bool
можно мне тоже кажется странным
Здравствуйте, Ytz, Вы писали:
Ytz>>>А зачем сделали такое неявное приведение? 24>>char* к bool? К bool многое приводится неявно, например чтоб писать if (p) вместо if (p != NULL) Ytz>В С нет bool, но написать if (p) можно
Видимо для единообразия. В С внутри условий ведь ноль воспринимается как ложь, всё остальное — как истина, т.е. есть некоторое подобие булевого типа, который нельзя явно записать. А в С++ раз уж bool есть, то логично, что if, while и прочее, где нужно логическое выражение, принимает именно bool, а не что угодно. Следовательно всё остальное к нему должно приводиться по аналогичныим правилам, как в С. И раз оно приводится к bool внутри условий, то должно приводится и снаружи. Хотя как по мне, то эти неявные приведения только добавляют путаницы, и я всегда пишу полностью if (p != NULL).
Здравствуйте, 24, Вы писали:
24>Здравствуйте, Ytz, Вы писали:
Ytz>>А зачем сделали такое неявное приведение?
24>char* к bool? К bool многое приводится неявно, например чтоб писать if (p) вместо if (p != NULL)
Здравствуйте, Ytz, Вы писали:
Ytz>>>А зачем сделали такое неявное приведение?
24>>char* к bool? К bool многое приводится неявно, например чтоб писать if (p) вместо if (p != NULL)
Ytz>В С нет bool, но написать if (p) можно
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, Ytz, Вы писали:
Ytz>>>>А зачем сделали такое неявное приведение?
24>>>char* к bool? К bool многое приводится неявно, например чтоб писать if (p) вместо if (p != NULL)
Ytz>>В С нет bool, но написать if (p) можно
NB>7.16 ISO/IEC 9899:1999?
Здравствуйте, Ytz, Вы писали:
24>>>>char* к bool? К bool многое приводится неявно, например чтоб писать if (p) вместо if (p != NULL)
Ytz>>>В С нет bool, но написать if (p) можно
NB>>7.16 ISO/IEC 9899:1999?
Ytz>И что?
Здравствуйте, night beast, Вы писали:
Ytz>>>>В С нет bool, но написать if (p) можно
NB>>>7.16 ISO/IEC 9899:1999?
Ytz>>И что?
NB>что "И что?"?
NB>там написано NB>
NB>The macro
NB>bool
NB>expands to _Bool.
NB>почему "написать if (p) можно" есть в 6.8.4.1.
Это ты говоришь о стандарте C99 в котором появился bool, но писать if (p) в C можно было всегда — это классика. Некоторые даже так извращались:
Здравствуйте, Vamp, Вы писали:
Ytz>>Очевидно, что раз в C нет bool, то и приведения к нему быть не может Правило простое: Ytz>>0 — false >>0 — true
V>Только ты в этом простом правиле ошибку сделал. !0 — true, а не >0. V>Кстати, в до-bool времена многие зачем-то (никогда не понимал, кстати) делали так:
V>
V>#define TRUE 1;
V>#define FALSE 0;
V>
V>Так вот это неправильно. Правильно так:
Тоже неправильно. Тогда уж так:
Здравствуйте, Ytz, Вы писали:
Ytz>Это ты говоришь о стандарте C99 в котором появился bool, но писать if (p) в C можно было всегда — это классика. Некоторые даже так извращались:
Ytz>Или как тебе классический K&R:
Ytz>
Ytz>while (*dst++ = *src++);
Ytz>
а, тебя интересует почему в c++ if принимает bool?
ну, во-первых это логично. во-вторых чтобы можно было использовать пользовательские типы в if.
Здравствуйте, Vamp, Вы писали:
Ytz>>Очевидно, что раз в C нет bool, то и приведения к нему быть не может Правило простое: Ytz>>0 — false >>0 — true
V>Только ты в этом простом правиле ошибку сделал. !0 — true, а не >0. V>Кстати, в до-bool времена многие зачем-то (никогда не понимал, кстати) делали так:
V>
Здравствуйте, Ytz, Вы писали:
Ytz>Лучше разобраться помоги, если знаешь
Пока что я не улавливаю в чём именно ты хочешь разобраться.
IMHO, ты просто прикалываешься...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, баг, Вы писали:
баг>Здравствуйте, Vamp, Вы писали:
Ytz>>>Очевидно, что раз в C нет bool, то и приведения к нему быть не может Правило простое: Ytz>>>0 — false >>>0 — true
V>>Только ты в этом простом правиле ошибку сделал. !0 — true, а не >0. V>>Кстати, в до-bool времена многие зачем-то (никогда не понимал, кстати) делали так:
V>>
V>>#define TRUE 1;
V>>#define FALSE 0;
V>>
V>>Так вот это неправильно. Правильно так: баг>Тоже неправильно. Тогда уж так: баг>
скобки в этом макросе ради чистоты или можете показать когда без них нарушится порядок ?
я хотел поставить сначала но посмотрев таблицу операторов передумал
Здравствуйте, 24, Вы писали:
24>Следовательно всё остальное к нему должно приводиться по аналогичныим правилам, как в С.
Занятно. Значит, VC отсебятину лепит с предупреждениями? http://codepad.org/neVNoRpu
Здравствуйте, Roman Odaisky, Вы писали:
баг>>>#define TRUE (!FALSE) J>>скобки в этом макросе ради чистоты или можете показать когда без них нарушится порядок ?
RO>TRUE[s], оно же s[1]
да этого то я и не заметил
и ведь знаю же эту конструкцию но ...
еще раз убедился что надо все тщательно проверять чем что то заключать
спасибо за пример
Здравствуйте, Vamp, Вы писали:
RO>>TRUE[s], оно же s[1] V>А в чем разница? Что со скобками, что без — компилируется все равно, хотя и не должно.
если без скобочек то
тут отрицание применяется к элементу мнимого массива
TRUE[s]
а тут к индексу
s[TRUE]
просто без скобочек меняется логика
а почему не должно ?
J>а почему не должно ?
А какой в этом коде смысл? Не забудь, TRUE и FALSE — аналог булевых значений. Сравни с конструкцией true[s] в С++ — какой в ней смысл? Хотя тоже компилируется, надо понимать потому, что bool неявно приводится к int.
Здравствуйте, Vamp, Вы писали:
J>>а почему не должно ? V>А какой в этом коде смысл? Не забудь, TRUE и FALSE — аналог булевых значений. Сравни с конструкцией true[s] в С++ — какой в ней смысл? Хотя тоже компилируется, надо понимать потому, что bool неявно приводится к int.
да понятно что код бредовый
но все таки это обман семантики TRUE[s]
никак не ожидаеш что к элементу будет применено отрицание
да и потом это к си тоже относится а там
какой нить ум может запросто применить TRUE
как индекс со значением 1 а получит черти что
Потому что char* — это указатель — это адрес, а адрес — это число, раньше bool не было — были числа — а неравенство числа нулю так и пишется. Позже пояивлся bool — число, false = 0, true!=0.
Нету у TRUE[s] семантики. По семантике TRUE — не целое значение, а булевое. Нельзя складывать указатели и булевые значения. А значит, ее нельзя обмануть. Еще раз — если бы был способ сделать так, чтобы подобная конструкция не компилировалась, то я был бы обеими руками за. А заменять один бессмысленный результат на другой — не виду смысла.
Здравствуйте, Vamp, Вы писали:
J>>но все таки это обман семантики TRUE[s]
V>Нету у TRUE[s] семантики. По семантике TRUE — не целое значение, а булевое. Нельзя складывать указатели и булевые значения. А значит, ее нельзя обмануть. Еще раз — если бы был способ сделать так, чтобы подобная конструкция не компилировалась, то я был бы обеими руками за. А заменять один бессмысленный результат на другой — не виду смысла.
это в C++ оно булевое а в C оно целое (в C99 ввели какой то _Bool но студия поддерживает только ANSI C) вот в нет нет никаких булевых значений
J>это в C++ оно булевое а в C оно целое (в C99 ввели какой то _Bool но студия поддерживает только ANSI C) вот в нет нет никаких булевых значений
С точки зрения семантики оно булевое, мы его именно для этого сей макрос и породили.
Здравствуйте, Vamp, Вы писали:
J>>это в C++ оно булевое а в C оно целое (в C99 ввели какой то _Bool но студия поддерживает только ANSI C) вот в нет нет никаких булевых значений V>С точки зрения семантики оно булевое, мы его именно для этого сей макрос и породили.
я понимаю вашу точку зрения у меня она немного отличная на этом и
прекратим дискуссию переходящую в бессмысленный спор
Здравствуйте, Vamp, Вы писали:
V>Нету у TRUE[s] семантики. По семантике TRUE — не целое значение, а булевое. Нельзя складывать указатели и булевые значения. А значит, ее нельзя обмануть.
V>Еще раз — если бы был способ сделать так, чтобы подобная конструкция не компилировалась, то я был бы обеими руками за.
Явное приведение к bool нормализует ненулевые значения в единицу, что, по-моему, имеет право на существование:
int count_of_positive_values = (x > 0) + (y > 0) + (z > 0) + bool(is_something_else_positive());
// где функция (наследие C) возвращает 0 или нечто, что может и не быть единицей
хотя с другой стороны, в таких случаях можно было бы требовать явного преобразования к int для четкого выражения замысла, даже если int(bool(f()) выглядит громоздко.