- 1
- 2
- 3
- 4
- 5
- 6
- 7
#import <Foundation/Foundation.h>
int main () {
BOOL b1 = 71151208, b2 = 107155712;
printf ("b1 is %s; b2 is %s.", (b1 ? "true" : "false"), (b2 ? "true" : "false"));
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−98
#import <Foundation/Foundation.h>
int main () {
BOOL b1 = 71151208, b2 = 107155712;
printf ("b1 is %s; b2 is %s.", (b1 ? "true" : "false"), (b2 ? "true" : "false"));
return 0;
}
Ох, как же я эпично выстрелил себе в ногу.
http://ideone.com/cRHaK2
b1 is true; b2 is false.
/me пошёл откапывать собаку
107155712 - 1й байт равен нулю, и он обрезается при приведении типа к BOOL (он один байт)
Главное, это работает. Моя картина мира выстояла.
вместо няшного
.
http://ideone.com/ulMfCV
очевиднее. Для того, чтобы переварить !! надо включать мозг )
!! - классика
один раз запомнил и пользуйся
Ты так говоришь, как будто это что-то плохое.
Но керниган и ритчи видимо о нем не слышали.
Согласен.
Я употребляю !! только для случаев типа:
Даже в конь-тексте жабьего скрипта это ужасная мерзость.
Странный bool в этой вашей objective-c. Char в овечьей шкуре?
P.S. Кстати в мускуле когда-то тоже запилили свой костыльный бул из чара, и неподумавши запихали в него результат чего-то типа memcmp, а потом, когда авторы glibc сделали небольшую оптимизацию (сравнение не по байтам, сразу по 4, чтобы быстрее), оно начало пропускать юзера под случайным паролем с вероятностью 1/256... Так что на багу int -> костыльный_бул вы попались не первым, ой не первым...
Именно, наследие Си. Причём там 3 типа, bool, BOOL и Boolean, и все 3 объявлены по разному.
#define bool BOOL
typedef unsigned char Boolean
typedef int boolean_t
4
плюс, да, бонусом NSNumber и NSValue, которые тоже могут представлять Boolean
typedef float FUZZYBOOL;
В общем когда делаешь язык или диалект - то лучше когда-нибудь, да отказаться от старого наследия и поддерживать только то что органично вписывается в структуры.
Пхп, кресты, жава - примеры обратной совместимости. В каждом куча граблей и в каждом остался мерзкий сишный switch.
Вот питон есть 2-й, а 3-й - уже немного другой язык.
Только сразу. Потом уже поздно, ибо уже написана куча проектов и либ.
> питон
Ну есть третий питон - а где он? Прошло уже 4 года, а половина либ не портирована, в тех же линухах по дефолту до сих пор стоит второй, софт юзает второй...
P.S. После поломки совместимости начинается еще больший бардак. Народ вместо того, чтобы перейти на новую версию начинает писать прослойки и ифдефы, поддерживающие и старое и новое... Так что хз еще, где пиздец жутче.
В конце концов много вещей переписывается с нуля.
>Прошло уже 4 года, а половина либ не портирована
Не считаю это большой проблемой, думаю лет через 10 многие скажут спасибо за отказ от этой обратной совместимости.
Ведь язык избавится от многих устаревших решений и потому будет проще.
Кто хочет - пишут на 2-ом. Зато практически весь новый код пишется под новую версию. Потому когда-нибудь наступит переломный момент.
> когда-нибудь
Я тоже думал над "сразу", но некоторые неудачные решения проявляются только после внедрения.
Иногда необходимо убирать ошибки прошлых версий.
Просто не нужно делать это слишком часто.
Сомневаюсь что в ближайшие десятилетия будут внедрят 4-ю, несовместимую версию.
> Сомневаюсь что в ближайшие десятилетия будут внедрят 4-ю, несовместимую версию.
Ну да, это его убьет.
> Просто не нужно делать это слишком часто.
И слишком редко походу тоже. Иначе получится как с явой или крестами - поломка обратной совместимости вызовет море батхертов.
К примеру я продавал свою либу. Вышла ява 1.8, в которой все безупречно и удобно, но она не совместима с явой 1.7. И передо мной стоит выбор - или переходить на 1.8 полностью (и терять всех клиентов, которые юзают 1.7, и не могут перейти на новую (а таких в "энтерпрайзе" будет большинство)), или оставаться на 1.7 (и не получать новых клиентов, т.к. новые проекты будут на 1.8), или наслаждаться разработкой под обе версии (как минимум лет 5)...
Ну как, сказали?
Язык-то не на много положе этого вашего C++ - всего на пару лет.
Говно мамонта типа вот такого тоже понимает?
http://ideone.com/1zC8Ht
Почему у меня работает?
Компилятор Кернигана и Ритчи после заголовка функции ожидает составной оператор (фигурные скобки) и всё, что описано до него, считает не локальными переменными, а описаниями параметров функции.
Для сравнения то же самое на Алголе-60 (за точность не ручаюсь): То же самое на Фортране-77 (тоже не ручаюсь за точность): А вот для сравнения в ANSI/ISO Си:
Only zero is false, they said.
Неужели я не один такой?
Я прямо разочаровался.
> 0, -1
А 1?
> истину мерять
Кулстори бро.
На паре (0,-1) побитовые и логические операции представляют собой одно и тоже.
То есть все биты - 1 Там получить ноль без логических и арифмитических операций даже при большом желании не получится.
http://stackoverflow.com/questions/8617581/how-to-call-enumsystemlocales-in-delphi
Там же есть ссылка на майкрософтовского архитекта, который перечисляет сколько булевых типов они изобрели, пока делали Windows.