Приведение char* к bool
От: Ytz https://github.com/mtrempoltsev
Дата: 08.04.11 07:38
Оценка: :))
Поясните почему char* приводиться к bool:

#include <iostream>
#include <string>

void Test(bool)
{
    std::cout << "bool";
}

void Test(const std::string&)
{
    std::cout << "std::string";
}

int main()
{
    Test("test");
}


Output:
bool


здесь
Re: Приведение char* к bool
От: Kswapd Россия  
Дата: 08.04.11 07:45
Оценка: 1 (1) +2 -3 :)
Ytz>Поясните почему char* приводиться к bool:

Сначала объясни, почему ты используешь такую орфографию.
Re: Приведение char* к bool
От: 24  
Дата: 08.04.11 07:51
Оценка: +3 :)
Здравствуйте, Ytz, Вы писали:

Ytz>Поясните почему char* приводиться к bool:


Скорее всего, потому что char* -> bool — "встроенное" преобразование, а char* -> std::string — пользовательское.
Re[2]: Приведение char* к bool
От: Ytz https://github.com/mtrempoltsev
Дата: 08.04.11 07:51
Оценка: :)
Здравствуйте, Kswapd, Вы писали:

Ytz>>Поясните почему char* приводиться к bool:


K>Сначала объясни, почему ты используешь такую орфографию.


Что смущает?
Re[2]: Приведение char* к bool
От: Ytz https://github.com/mtrempoltsev
Дата: 08.04.11 07:53
Оценка: :)
Здравствуйте, 24, Вы писали:

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


Ytz>>Поясните почему char* приводиться к bool:


24>Скорее всего, потому что char* -> bool — "встроенное" преобразование, а char* -> std::string — пользовательское.


Но если вместо bool, например, поставить int, то приведения не будет, а будет вызов конструктора std::string
Re[3]: Приведение char* к bool
От: Kswapd Россия  
Дата: 08.04.11 07:54
Оценка: -1
Ytz>Что смущает?

tsya.ru
Re[3]: Приведение char* к bool
От: 24  
Дата: 08.04.11 07:57
Оценка: 6 (1)
Здравствуйте, Ytz, Вы писали:

Ytz>Но если вместо bool, например, поставить int, то приведения не будет, а будет вызов конструктора std::string


Так char* к int неявно не приводится.
Re[4]: Приведение char* к bool
От: Ytz https://github.com/mtrempoltsev
Дата: 08.04.11 08:00
Оценка: 1 (1)
Здравствуйте, Kswapd, Вы писали:

Ytz>>Что смущает?


K>tsya.ru


Спасибо, я обязательно выучу правило и больше не буду делать таких ошибок.
Re[4]: Приведение char* к bool
От: Ytz https://github.com/mtrempoltsev
Дата: 08.04.11 08:13
Оценка: :)
Здравствуйте, 24, Вы писали:

24>Так char* к int неявно не приводится.


А зачем сделали такое неявное приведение?
Re[2]: Приведение char* к bool
От: alexstr Россия  
Дата: 08.04.11 08:20
Оценка:
А, может быть, немного наивный вопрос, если сначала объявлять функцию со ссылкой результат будет тот же?
Re[5]: Приведение char* к bool
От: 24  
Дата: 08.04.11 08:27
Оценка:
Здравствуйте, Ytz, Вы писали:

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


char* к bool? К bool многое приводится неявно, например чтоб писать if (p) вместо if (p != NULL)
Re[3]: Приведение char* к bool
От: wander  
Дата: 08.04.11 09:47
Оценка:
Здравствуйте, alexstr, Вы писали:

A>А, может быть, немного наивный вопрос, если сначала объявлять функцию со ссылкой результат будет тот же?

угу.
Re[6]: Приведение char* к bool
От: Ytz https://github.com/mtrempoltsev
Дата: 08.04.11 11:31
Оценка:
Здравствуйте, 24, Вы писали:

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


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


24>char* к bool? К bool многое приводится неявно, например чтоб писать if (p) вместо if (p != NULL)


В С нет bool, но написать if (p) можно
Re[7]: Приведение char* к bool
От: night beast СССР  
Дата: 08.04.11 11:42
Оценка:
Здравствуйте, Ytz, Вы писали:

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


24>>char* к bool? К bool многое приводится неявно, например чтоб писать if (p) вместо if (p != NULL)


Ytz>В С нет bool, но написать if (p) можно


7.16 ISO/IEC 9899:1999?
Re[8]: Приведение char* к bool
От: Ytz https://github.com/mtrempoltsev
Дата: 08.04.11 11:56
Оценка:
Здравствуйте, 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?


И что?
Re[9]: Приведение char* к bool
От: night beast СССР  
Дата: 08.04.11 12:04
Оценка:
Здравствуйте, Ytz, Вы писали:

24>>>>char* к bool? К bool многое приводится неявно, например чтоб писать if (p) вместо if (p != NULL)


Ytz>>>В С нет bool, но написать if (p) можно


NB>>7.16 ISO/IEC 9899:1999?


Ytz>И что?


что "И что?"?

там написано

The macro
bool
expands to _Bool.


почему "написать if (p) можно" есть в 6.8.4.1.
Re[10]: Приведение char* к bool
От: Ytz https://github.com/mtrempoltsev
Дата: 08.04.11 12:15
Оценка:
Здравствуйте, 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 можно было всегда — это классика. Некоторые даже так извращались:

#define FALSE 0
#define TRUE 1
#define BOOL int


Или как тебе классический K&R:

while (*dst++ = *src++);
Re[11]: Приведение char* к bool
От: mike_rs Россия  
Дата: 08.04.11 12:17
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>Или как тебе классический K&R:


Ytz>
Ytz>while (*dst++ = *src++);
Ytz>


ну и где здесь приведение char * к bool ?
Re[11]: Приведение char* к bool
От: jyuyjiyuijyu  
Дата: 08.04.11 12:28
Оценка: :)
в C любое арифметическое выражение преобразуется в int
в виде 0 или 1 если находится в if while for
указатели целые вещественные без разницы все в int
так было в ANSI C как в C99 незнаю то что в
C++ указатель к int нельзя неявно привести а к bool
можно мне тоже кажется странным
Re[12]: Приведение char* к bool
От: Ytz https://github.com/mtrempoltsev
Дата: 08.04.11 12:28
Оценка:
Здравствуйте, mike_rs, Вы писали:

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


Ytz>>Или как тебе классический K&R:


Ytz>>
Ytz>>while (*dst++ = *src++);
Ytz>>


_>ну и где здесь приведение char * к bool ?


Очевидно, что раз в C нет bool, то и приведения к нему быть не может Правило простое:
0 — false
>0 — true
Re[5]: Егор, что веселишься?
От: Ytz https://github.com/mtrempoltsev
Дата: 08.04.11 12:31
Оценка: :)
Лучше разобраться помоги, если знаешь
Re[2]: Приведение char* к bool
От: Vamp Россия  
Дата: 08.04.11 12:31
Оценка:
K>Сначала объясни, почему ты используешь такую орфографию.
Ты в диктанте про Агриппину Савишну сколько ошибок делаешь?
Да здравствует мыло душистое и веревка пушистая.
Re[13]: Приведение char* к bool
От: Vamp Россия  
Дата: 08.04.11 12:35
Оценка:
Ytz>Очевидно, что раз в C нет bool, то и приведения к нему быть не может Правило простое:
Ytz>0 — false
>0 — true

Только ты в этом простом правиле ошибку сделал. !0 — true, а не >0.
Кстати, в до-bool времена многие зачем-то (никогда не понимал, кстати) делали так:

#define TRUE 1;
#define FALSE 0;


Так вот это неправильно. Правильно так:
#define FALSE 0;
#define TRUE !FALSE;
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Приведение char* к bool
От: Vamp Россия  
Дата: 08.04.11 12:41
Оценка: 5 (2)
24>Скорее всего, потому что char* -> bool — "встроенное" преобразование, а char* -> std::string — пользовательское.
Если говорить в терминах, то char* в bool — это так называемое boolean conversion (4.12), а char* в std::string — вызов пользовательского преобразования, conversion by constructor. У первого приоритет выше.
Да здравствует мыло душистое и веревка пушистая.
Re[14]: Приведение char* к bool
От: баг  
Дата: 08.04.11 12:42
Оценка:
Здравствуйте, 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>Так вот это неправильно. Правильно так:

Тоже неправильно. Тогда уж так:
#define FALSE 0
#define TRUE (!FALSE)
Re[11]: Приведение char* к bool
От: night beast СССР  
Дата: 08.04.11 12:44
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>Это ты говоришь о стандарте C99 в котором появился bool, но писать if (p) в C можно было всегда — это классика. Некоторые даже так извращались:


Ytz>Или как тебе классический K&R:


Ytz>
Ytz>while (*dst++ = *src++);
Ytz>


а, тебя интересует почему в c++ if принимает bool?
ну, во-первых это логично. во-вторых чтобы можно было использовать пользовательские типы в if.
Re[14]: Приведение char* к bool
От: jyuyjiyuijyu  
Дата: 08.04.11 12:44
Оценка:
Здравствуйте, 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>Так вот это неправильно. Правильно так:

V>
V>#define FALSE 0;
V>#define TRUE !FALSE;
V>

может без ;
#define FALSE 0
#define TRUE !FALSE

оно не в каждом выражении можно

а почему неправильно ?
Re[6]: Егор, что веселишься?
От: Erop Россия  
Дата: 08.04.11 12:45
Оценка:
Здравствуйте, Ytz, Вы писали:

Ytz>Лучше разобраться помоги, если знаешь


Пока что я не улавливаю в чём именно ты хочешь разобраться.
IMHO, ты просто прикалываешься...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: Приведение char* к bool
От: Vamp Россия  
Дата: 08.04.11 12:48
Оценка:
баг>Тоже неправильно. Тогда уж так:
#define FALSE 0
#define TRUE (!FALSE)


Обоснуй, пожалуйста.
Да здравствует мыло душистое и веревка пушистая.
Re[15]: Приведение char* к bool
От: jyuyjiyuijyu  
Дата: 08.04.11 12:50
Оценка:
Здравствуйте, баг, Вы писали:

баг>Здравствуйте, 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>>Так вот это неправильно. Правильно так:

баг>Тоже неправильно. Тогда уж так:
баг>
баг>#define FALSE 0
баг>#define TRUE (!FALSE)
баг>

скобки в этом макросе ради чистоты или можете показать когда без них нарушится порядок ?
я хотел поставить сначала но посмотрев таблицу операторов передумал
Re[14]: Приведение char* к bool
От: Vamp Россия  
Дата: 08.04.11 12:53
Оценка: :)))
V>Так вот это неправильно. Правильно так...
И быстренько, пока меня не выпороли, убираю точки с запятой после определения макросов
Да здравствует мыло душистое и веревка пушистая.
Re[7]: Приведение char* к bool
От: 24  
Дата: 08.04.11 17:31
Оценка: +1
Здравствуйте, Ytz, Вы писали:

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

24>>char* к bool? К bool многое приводится неявно, например чтоб писать if (p) вместо if (p != NULL)
Ytz>В С нет bool, но написать if (p) можно

Видимо для единообразия. В С внутри условий ведь ноль воспринимается как ложь, всё остальное — как истина, т.е. есть некоторое подобие булевого типа, который нельзя явно записать. А в С++ раз уж bool есть, то логично, что if, while и прочее, где нужно логическое выражение, принимает именно bool, а не что угодно. Следовательно всё остальное к нему должно приводиться по аналогичныим правилам, как в С. И раз оно приводится к bool внутри условий, то должно приводится и снаружи. Хотя как по мне, то эти неявные приведения только добавляют путаницы, и я всегда пишу полностью if (p != NULL).
Re[8]: Приведение char* к bool
От: баг  
Дата: 09.04.11 00:01
Оценка:
Здравствуйте, 24, Вы писали:

24>Следовательно всё остальное к нему должно приводиться по аналогичныим правилам, как в С.

Занятно. Значит, VC отсебятину лепит с предупреждениями? http://codepad.org/neVNoRpu
Re[16]: Приведение char* к bool
От: Roman Odaisky Украина  
Дата: 09.04.11 16:04
Оценка: 8 (1)
баг>>#define TRUE (!FALSE)
J>скобки в этом макросе ради чистоты или можете показать когда без них нарушится порядок ?

TRUE[s], оно же s[1]
До последнего не верил в пирамиду Лебедева.
Re[17]: Приведение char* к bool
От: jyuyjiyuijyu  
Дата: 09.04.11 23:07
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

баг>>>#define TRUE (!FALSE)

J>>скобки в этом макросе ради чистоты или можете показать когда без них нарушится порядок ?

RO>TRUE[s], оно же s[1]

да этого то я и не заметил
и ведь знаю же эту конструкцию но ...
еще раз убедился что надо все тщательно проверять чем что то заключать
спасибо за пример
Re[17]: Приведение char* к bool
От: Vamp Россия  
Дата: 11.04.11 12:39
Оценка:
RO>TRUE[s], оно же s[1]
А в чем разница? Что со скобками, что без — компилируется все равно, хотя и не должно.
Да здравствует мыло душистое и веревка пушистая.
Re[18]: Приведение char* к bool
От: jyuyjiyuijyu  
Дата: 11.04.11 12:55
Оценка:
Здравствуйте, Vamp, Вы писали:

RO>>TRUE[s], оно же s[1]

V>А в чем разница? Что со скобками, что без — компилируется все равно, хотя и не должно.
если без скобочек то
тут отрицание применяется к элементу мнимого массива
TRUE[s]
а тут к индексу
s[TRUE]
просто без скобочек меняется логика
а почему не должно ?
Re[19]: Приведение char* к bool
От: Vamp Россия  
Дата: 11.04.11 12:58
Оценка:
J>а почему не должно ?
А какой в этом коде смысл? Не забудь, TRUE и FALSE — аналог булевых значений. Сравни с конструкцией true[s] в С++ — какой в ней смысл? Хотя тоже компилируется, надо понимать потому, что bool неявно приводится к int.
Да здравствует мыло душистое и веревка пушистая.
Re[20]: Приведение char* к bool
От: jyuyjiyuijyu  
Дата: 11.04.11 13:13
Оценка:
Здравствуйте, Vamp, Вы писали:

J>>а почему не должно ?

V>А какой в этом коде смысл? Не забудь, TRUE и FALSE — аналог булевых значений. Сравни с конструкцией true[s] в С++ — какой в ней смысл? Хотя тоже компилируется, надо понимать потому, что bool неявно приводится к int.
да понятно что код бредовый
но все таки это обман семантики TRUE[s]
никак не ожидаеш что к элементу будет применено отрицание
да и потом это к си тоже относится а там
какой нить ум может запросто применить TRUE
как индекс со значением 1 а получит черти что
Re: Приведение char* к bool
От: Uzumaki Naruto Ниоткуда  
Дата: 11.04.11 13:27
Оценка:
Потому что char* — это указатель — это адрес, а адрес — это число, раньше bool не было — были числа — а неравенство числа нулю так и пишется. Позже пояивлся bool — число, false = 0, true!=0.

Re[21]: Приведение char* к bool
От: Vamp Россия  
Дата: 11.04.11 13:27
Оценка:
J>но все таки это обман семантики TRUE[s]

Нету у TRUE[s] семантики. По семантике TRUE — не целое значение, а булевое. Нельзя складывать указатели и булевые значения. А значит, ее нельзя обмануть. Еще раз — если бы был способ сделать так, чтобы подобная конструкция не компилировалась, то я был бы обеими руками за. А заменять один бессмысленный результат на другой — не виду смысла.
Да здравствует мыло душистое и веревка пушистая.
Re[22]: Приведение char* к bool
От: jyuyjiyuijyu  
Дата: 11.04.11 13:34
Оценка:
Здравствуйте, Vamp, Вы писали:

J>>но все таки это обман семантики TRUE[s]


V>Нету у TRUE[s] семантики. По семантике TRUE — не целое значение, а булевое. Нельзя складывать указатели и булевые значения. А значит, ее нельзя обмануть. Еще раз — если бы был способ сделать так, чтобы подобная конструкция не компилировалась, то я был бы обеими руками за. А заменять один бессмысленный результат на другой — не виду смысла.

это в C++ оно булевое а в C оно целое (в C99 ввели какой то _Bool но студия поддерживает только ANSI C) вот в нет нет никаких булевых значений
Re[23]: Приведение char* к bool
От: Vamp Россия  
Дата: 11.04.11 13:42
Оценка:
J>это в C++ оно булевое а в C оно целое (в C99 ввели какой то _Bool но студия поддерживает только ANSI C) вот в нет нет никаких булевых значений
С точки зрения семантики оно булевое, мы его именно для этого сей макрос и породили.
Да здравствует мыло душистое и веревка пушистая.
Re[24]: Приведение char* к bool
От: jyuyjiyuijyu  
Дата: 11.04.11 13:53
Оценка:
Здравствуйте, Vamp, Вы писали:

J>>это в C++ оно булевое а в C оно целое (в C99 ввели какой то _Bool но студия поддерживает только ANSI C) вот в нет нет никаких булевых значений

V>С точки зрения семантики оно булевое, мы его именно для этого сей макрос и породили.
я понимаю вашу точку зрения у меня она немного отличная на этом и
прекратим дискуссию переходящую в бессмысленный спор
Re[22]: Приведение char* к bool
От: Roman Odaisky Украина  
Дата: 11.04.11 13:58
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Нету у TRUE[s] семантики. По семантике TRUE — не целое значение, а булевое. Нельзя складывать указатели и булевые значения. А значит, ее нельзя обмануть.


printf("something happened: %c", something_happened()["ny"]);


V>Еще раз — если бы был способ сделать так, чтобы подобная конструкция не компилировалась, то я был бы обеими руками за.


Явное приведение к bool нормализует ненулевые значения в единицу, что, по-моему, имеет право на существование:

int count_of_positive_values = (x > 0) + (y > 0) + (z > 0) + bool(is_something_else_positive());
// где функция (наследие C) возвращает 0 или нечто, что может и не быть единицей

хотя с другой стороны, в таких случаях можно было бы требовать явного преобразования к int для четкого выражения замысла, даже если int(bool(f()) выглядит громоздко.
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.