Здравствуйте, Neo_pool, Вы писали:
N_>В общем кто у нас владеет особой кодерской магией, язык С++?
может нужно было варнинг подавить, а какой компилятор?
еще бы перед последней скобкой return поставить, тогда варнинга точно не будет
Здравствуйте, Neo_pool, Вы писали:
N_>А я вот подумал, а давайте поиграем в Девидов Блейнов ?)) N_>На баше недавно цитату разместили: N_>
N_>string iff(bool f)
N_>{
N_> switch(f)
N_> {
N_> case 0:
N_> return"false";
N_> case 1:
N_> return"true";
N_> default:
N_> return"Ненене, Дэвид Блэйн, ненене!!";
N_> }
N_>}
N_>
N_>Мы всем отделом конечно посмеялись
N_>В общем кто у нас владеет особой кодерской магией, язык С++?
Не знаю на счет магии, но код не однозначный. Судя по подстветке очень похоже на MSVC 2005. Но там по-умолчанию типа String нет.
Далее
In Visual C++4.2, the Standard C++ header files contained a typedef that equated bool with int. In Visual C++ 5.0 and later, bool is implemented as a built-in type with a size of 1 byte. That means that for Visual C++ 4.2, a call of sizeof(bool) yields 4, while in Visual C++ 5.0 and later, the same call yields 1. This can cause memory corruption problems if you have defined structure members of type bool in Visual C++ 4.2 and are mixing object files (OBJ) and/or DLLs built with the 4.2 and 5.0 or later compilers.
The __BOOL_DEFINED macro can be used to wrap code that is dependent on whether or not bool is supported.
Опять же, MSVC по умолчанию использует UNICODE, соответственно ни одна строковая константа не скомпилится (правда, зависит от типа string). Ну и далее, смотря что передано в функцию. Никто не запрещает вызвать ее так:
iff((bool)5)
однако, в этом случае (не проверял, но почему-то уверен) передастся все равно 1, так как 5!=0 и соответственно true (==1).
Вывод — код полный фейк и ничего смешного в нем нет.
MP>однако, в этом случае (не проверял, но почему-то уверен) передастся все равно 1, так как 5!=0 и соответственно true (==1).
ИМХО в большинстве языков/компиляторов передастся именно 5, а не 1. Ибо true обычно определяется в спецификациях как "всё, что не 0". Вот цитата из Википедии для C:
"...all the boolean operators (&&, ||) and conditional statements (if, while) in C interpret nonzero values to signify true and zero values to signify false. Thus, it is common to store boolean values in variables of another type, such as an integer or an enum."
Неплохой вопрос для собеседования: "Насколько смешным вам кажется этот код?"
Здравствуйте, Neo_pool, Вы писали: N_>А я вот подумал, а давайте поиграем в Девидов Блейнов ?)) N_>На баше недавно цитату разместили: N_>
N_>string iff(bool f)
N_>{
N_> switch(f)
N_> {
N_> case 0:
N_> return"false";
N_> case 1:
N_> return"true";
N_> default:
N_> return"Ненене, Дэвид Блэйн, ненене!!";
N_> }
N_>}
N_>
N_>Мы всем отделом конечно посмеялись N_>В общем кто у нас владеет особой кодерской магией, язык С++?
Почему не полностью код привели, case 2 убрали ? http://bash.org.ru/quote/397328
Здравствуйте, MikePetrichenko, Вы писали:
MP>iff((bool)5)
MP>однако, в этом случае (не проверял, но почему-то уверен) передастся все равно 1, так как 5!=0 и соответственно true (==1).
Здравствуйте, Neo_pool, Вы писали:
N_>А я вот подумал, а давайте поиграем в Девидов Блейнов ?))
N_>В общем кто у нас владеет особой кодерской магией, язык С++?
Легко
#include <string>
#include <iostream>
std::string iff(bool f)
{
switch(f)
{
case 0:
return"false";
case 1:
return"true";
default:
return"Ненене, Дэвид Блэйн, ненене!!";
}
}
int main()
{
bool b;
std::cout << iff(b) << "\n";
}
Здравствуйте, Sealcon190, Вы писали:
S>Здравствуйте, Neo_pool, Вы писали:
N_>>А я вот подумал, а давайте поиграем в Девидов Блейнов ?)) N_>>На баше недавно цитату разместили:
S>А кто такой Девид Блейн?
Реальный уличный фокусник, это пародия на его представления.
Здравствуйте, andy1618, Вы писали:
MP>>однако, в этом случае (не проверял, но почему-то уверен) передастся все равно 1, так как 5!=0 и соответственно true (==1).
A>ИМХО в большинстве языков/компиляторов передастся именно 5, а не 1. Ибо true обычно определяется в спецификациях как "всё, что не 0". Вот цитата из Википедии для C: A>
A>"...all the boolean operators (&&, ||) and conditional statements (if, while) in C interpret nonzero values to signify true and zero values to signify false. Thus, it is common to store boolean values in variables of another type, such as an integer or an enum."
Вы не совсем внимательно прочли. Я же указал, что мои рассуждения применительные к MSVS 2005 и привел выдержку из MSDN, в которой сказано, что bool в MSVC>4.2 это именно true(1) и false(0).
A>Неплохой вопрос для собеседования: "Насколько смешным вам кажется этот код?"
Ничего смешного. Когда я работал на одну корейскую компанию, в их СДК был переопределённый bool (типа инт), который официально мог принимать заначения 0, 1, 1001 и 1002.
Здравствуйте, Kore Sar, Вы писали:
KS>Здравствуйте, Neo_pool, Вы писали:
N_>>В общем кто у нас владеет особой кодерской магией, язык С++?
KS>Когда я добавлял эту цитату на баш, то её автор сказал, что это Джава.
Жаль, что в Java нету типа string (есть String) и типа bool (есть boolean)
Здравствуйте, Alxndr, Вы писали:
A>Здравствуйте, Kore Sar, Вы писали:
KS>>Здравствуйте, Neo_pool, Вы писали:
N_>>>В общем кто у нас владеет особой кодерской магией, язык С++?
KS>>Когда я добавлял эту цитату на баш, то её автор сказал, что это Джава.
A>Жаль, что в Java нету типа string (есть String) и типа bool (есть boolean)
То, что у автор сией цитаты (на баше) проблемы как с первым (C++), так и со вторым (Java), было ясно сразу.
MP>Вы не совсем внимательно прочли. Я же указал, что мои рассуждения применительные к MSVS 2005 и привел выдержку из MSDN, в которой сказано, что bool в MSVC>4.2 это именно true(1) и false(0).
С этим не спорю (хотя в вашей цитате из MSDN речь идёт только о размере переменной bool).
А вопрос в другом — что в программе могут быть не только "чистые" значения bool (0, 1), но и "грязные" значения (для 1-байтного представления: 2..255). Последние могут получиться, к примеру, при загрузке извне или при некоторых специальных фокусах (пара примеров приведена в комментариях на баше).
Соответственно, вопрос в том, будет ли компилятор "очищать" грязные значения true в разных ситуациях:
1) при приведении типов (int к bool)
2) при передаче параметра bool в функцию
3) при сравнениях с константой true (например, в switch)
...
Судя по приведённым на баше примерам для разных компиляторов C++, ответы эти на вопросы по-видимому такие: да, нет, нет.
Поэтому вы, действительно, были правы (что bool(5) будет приведён к 1).
И, соглашусь, что такой код надо отправлять фтопку, ибо вероятность словить "Девида Блейна" далеко не нулевая
Здравствуйте, MikePetrichenko, Вы писали:
MP>Не знаю на счет магии, но код не однозначный. Судя по подстветке очень похоже на MSVC 2005. Но там по-умолчанию типа String нет.
MP>Далее
MP>In Visual C++4.2, the Standard C++ header files contained a typedef that equated bool with int. In Visual C++ 5.0 and later, bool is implemented as a built-in type with a size of 1 byte. That means that for Visual C++ 4.2, a call of sizeof(bool) yields 4, while in Visual C++ 5.0 and later, the same call yields 1. This can cause memory corruption problems if you have defined structure members of type bool in Visual C++ 4.2 and are mixing object files (OBJ) and/or DLLs built with the 4.2 and 5.0 or later compilers.
MP>The __BOOL_DEFINED macro can be used to wrap code that is dependent on whether or not bool is supported.
MP>Опять же, MSVC по умолчанию использует UNICODE, соответственно ни одна строковая константа не скомпилится (правда, зависит от типа string). Ну и далее, смотря что передано в функцию. Никто не запрещает вызвать ее так:
...
MP>Вывод — код полный фейк и ничего смешного в нем нет.
Уважаемый, если уж критиковать шутки, так по делу Размер переменной типа bool (1 или 4 байта) не имеет никакого отношение к ее содержимому. Тип string входит в стандарт C++ с 1998 года. И строковые литералы без буковки L к нему совершенно спокойно приводятся. Да и как зависит способность <скомпилироваться> строковых литералов от того, что MSVC по умолчанию использует UNICODE?
Если уж придираться так к тому, что true совсем не обязано быть равно единице.