Здравствуйте, 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).
Вывод — код полный фейк и ничего смешного в нем нет.
Здравствуйте, 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
Здравствуйте, 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>А кто такой Девид Блейн?
Реальный уличный фокусник, это пародия на его представления.
Ничего смешного. Когда я работал на одну корейскую компанию, в их СДК был переопределённый bool (типа инт), который официально мог принимать заначения 0, 1, 1001 и 1002.
Здравствуйте, Alxndr, Вы писали:
A>Здравствуйте, Kore Sar, Вы писали:
KS>>Здравствуйте, Neo_pool, Вы писали:
N_>>>В общем кто у нас владеет особой кодерской магией, язык С++?
KS>>Когда я добавлял эту цитату на баш, то её автор сказал, что это Джава.
A>Жаль, что в Java нету типа string (есть String) и типа bool (есть boolean)
То, что у автор сией цитаты (на баше) проблемы как с первым (C++), так и со вторым (Java), было ясно сразу.
Здравствуйте, 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 совсем не обязано быть равно единице.
Здравствуйте, Neo_pool, Вы писали:
N_>В общем кто у нас владеет особой кодерской магией, язык С++?
может нужно было варнинг подавить, а какой компилятор?
еще бы перед последней скобкой return поставить, тогда варнинга точно не будет
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."
Неплохой вопрос для собеседования: "Насколько смешным вам кажется этот код?"
Здравствуйте, MikePetrichenko, Вы писали:
MP>iff((bool)5)
MP>однако, в этом случае (не проверял, но почему-то уверен) передастся все равно 1, так как 5!=0 и соответственно true (==1).
Здравствуйте, 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>Неплохой вопрос для собеседования: "Насколько смешным вам кажется этот код?"
Здравствуйте, Kore Sar, Вы писали:
KS>Здравствуйте, Neo_pool, Вы писали:
N_>>В общем кто у нас владеет особой кодерской магией, язык С++?
KS>Когда я добавлял эту цитату на баш, то её автор сказал, что это Джава.
Жаль, что в Java нету типа string (есть String) и типа bool (есть boolean)
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).
И, соглашусь, что такой код надо отправлять фтопку, ибо вероятность словить "Девида Блейна" далеко не нулевая
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, vzankin, Вы писали:
V>>Если уж придираться так к тому, что true совсем не обязано быть равно единице.
J>Вообще-то обязано.
Вот получишь из внешней паскально-дельфовой системы true как -1, потом будешь рассказывать кому оно что обязано
Здравствуйте, Pyromancer, Вы писали:
V>>>Если уж придираться так к тому, что true совсем не обязано быть равно единице.
J>>Вообще-то обязано.
P>Вот получишь из внешней паскально-дельфовой системы true как -1, потом будешь рассказывать кому оно что обязано
К слову, в Object Pascal "чистое" значение true тоже равно 1, но в спецификации определено и то, как трактовать "грязные" значения:
A value of type ByteBool, LongBool, or WordBool is considered True when its ordinality is nonzero. If such a value appears in a context where a Boolean is expected, the compiler automatically converts any value of nonzero ordinality to True.
Интересно ещё, что в Excel в листовых функциях значение TRUE = 1, а в VBA-макросах TRUE = -1. Тоже накушаться можно при неграмотном подходе
Здравствуйте, NikeByNike, Вы писали:
NBN>Ничего смешного. Когда я работал на одну корейскую компанию, в их СДК был переопределённый bool (типа инт), который официально мог принимать заначения 0, 1, 1001 и 1002.
"нет", "да", "скорее нет, чем да", "скорее да, чем нет"?
Здравствуйте, Neo_pool, Вы писали:
N_>А я вот подумал, а давайте поиграем в Девидов Блейнов ?)) N_>На баше недавно цитату разместили:
Да ну, подумаешь Девид Блейн. Есть волшебники и покруче
using System;
namespace Euro08
{
public class Spain_vs_Russia
{
public static string iff(int Spain, int Russia)
{
switch(Spain > Russia)
{
case true:
return"false";
default:
return"Ненене, Гус Хиддинк, ненене!!"; //в отпуск тебе пока рано? :???:
}
}
public static void Main(string[] args)
{
//в случае серии пенальти указать счет в ней
Console.Write(iff(1,4));
}
}
}
Здравствуйте, Димчанский, Вы писали:
NBN>>bool (типа инт), который официально мог принимать заначения 0, 1, 1001 и 1002. Д>"нет", "да", "скорее нет, чем да", "скорее да, чем нет"?
"скорее да, чем нет" это 1000, а 1002 это всем известный "на нет наверное".
Здравствуйте, MikePetrichenko, Вы писали:
MP>Здравствуйте, 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_>>В общем кто у нас владеет особой кодерской магией, язык С++?
MP>Не знаю на счет магии, но код не однозначный. Судя по подстветке очень похоже на MSVC 2005. Но там по-умолчанию типа String нет.
Во-первых не String а string. Во вторых разве std::string не то?
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса