- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
#include <iostream>
using namespace std;
int main() {
// your code goes here
float f = 267.0f;
unsigned char c = f;
cout << (int)c << endl;
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+63
#include <iostream>
using namespace std;
int main() {
// your code goes here
float f = 267.0f;
unsigned char c = f;
cout << (int)c << endl;
return 0;
}
Кресты помогают обнаруживать ошибки в логике программы. За это Страуструпу респект и уважуха.
http://ideone.com/V9rgSC
Хм, у меня 11 вывело, как я и ожидал.
Баг gcc? Или так и положено по стандарту?
1. An rvalue of a floating point type can be converted to an rvalue of an integer type. The conversion truncates; that is, the fractional part is discarded. The behavior is undefined if the truncated value cannot be represented in the destination type.
Вот так вот :(
Ну вообще говоря и 255 и 11 вполне осмысленные ответы, вот только компилятор, сука, мог бы и предупредить. На целых числах же про truncation постоянно ругается.
Вывод: видим при компиляции, что происходит переполнение — заменяем жёстко на UCHAR_MAX. В рантайме — как байты лягут.
Отличный пример. Утащил для наглядной демонстрации UB.
Кстати, а что альтернативные компиляторы? Студия ругается? и ввести 267, то выйдет 11 даже на О2.
> std::cin >> f;
http://ideone.com/nvjdXC
Где UB?
http://ideone.com/LbogiH
Как Борманд выше сказал, нужно компилировать с -Wconversion, чтобы получить варнинг.
Вообще не хватает опции -Weverything
-Weverything
-Wreallyeverything
-Weverythingandskyandallah
Получил сотни подобных ворнингов:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\limits(1270) : warning C4514: 'std::numeric_limits<double>::signaling_ NaN' : unreferenced inline function has been removed
Просто студия не умеет разделять ворнинги на пользовательские и системные. И показывает юзеру тонны ворнингов из своих же хидеров.
gcc по дефолту так не делает, и поэтому там нет этой проблемы с портянкой бесполезных предупреждений.
#pragma GCC system_header
Если я не ошибаюсь буст так же подавляет варнинги в себе
Почему header читается как хидер?
Ближе к GCC'шному -Wall будет, пожалуй, /W4.
Человеку много пишущему/компиляющему на крестах надо знать как таблицу умножения. Имхо азы.
Откройте же для себя наконец SO.
http://stackoverflow.com/a/3376483
http://stackoverflow.com/questions/154630/recommended-gcc-warning-options-for-c
-Weffc++
-Pedantic
?
Ну а список ворнингов есть на сайте gcc, выбери те, которые не будут тебя бесить ;)
Особенно про неявный каст инта в флоат. Я считаю, что тот, кто брезгует явно приводить тип - недостойный говнокодер.
А смысл? Ну будут люди на автомате бездумно втыкать касты где надо и где не надо... Никаких проблем это не решает. Разве что страхует от случайных опечаток.
А каст одинаково плох что в явной форме, что в неявной - он скрывает семантику преобразования. Тот же каст флоата в инт - что он должен олицетворять? floor? ceil? round? Банковское округление? Каст целого в меньшее - обрезать биты, подставить максимум, или вообще кинуть исключение? Каст числа в строку - как именно форматировать ее? Каст чего-то в бул - почему именно эти значения являются false? Особенно это касается слабой тупизации аля PHP, где "0" считается за false, "0.0" за true, а 0.0 за false.
Так что все касты (включая явные) надо тупо закопать, а вместо них дать набор функций с четкой и ясной семантикой.
Ну и dynamic_cast оставить, т.к. он и есть та самая функция с понятной семантикой. И заменить его нечем.
Это тоже не надо. От тупого присваивания беды не будет, а вот от логических битоебских операций между лонгом и интом я когда-то пострадал.
int a=3;
<.дохера кода.>
long mask=3<<shift; //где shift [0..63]
long res=mask & a; //лучше бы тут был ворнинг
если shift хотя бы 32, то res обнуляется, да?
И вообще если shift хотя бы 2, то res обнуляется.
А что не так-то?
Нет. Сдвиг на число, большее нежели разрядность - в крестах и сишке UB (в яве не UB, но я не помню что конкретно).
На х86 результат не зануляется, а просто сдвигается на shift & 31 (если число было 32 битным).
На других архитектурах может и занулиться.
UPD: В жабе та же херня: If the promoted type of the left-hand operand is int, only the five lowest-order bits of the right-hand operand are used as the shift distance. If the promoted type of the left-hand operand is long, then only the six lowest-order bits of the right-hand operand are used as the shift distance..
Да, об этом и говорил Пи. Если бы не было неявного каста инта в лонг - компилятор бы его обматерил. А т.к. неявный каст есть - сдвинуло инт как попало, а потом привело к лонгу.
Как это гуглить начинающему?
>>Так что все касты (включая явные) надо тупо закопать, а вместо них дать набор функций с четкой и ясной семантикой.
Да-да-да. +100500.
Функции и гуглятся, и семантика определена, и каст в целом сахар от которого толстеет язык.
Сахар, который можно заменить стандартным средством композиции.
SomeAbstractShit a=cast(b).getA();
чем
SomeAbstractShit a=((SomeAbstractShit) b).getA();
Посему выжигать сишкоблядское наследие.
b.(SomeType).GetA()
в любом случае, за пределами гейдева (в это сложно поверить) существует огромный пласт задач, в которых плавающий питух ненужен вообще - у меня на старой работе даже был класс устройств, которые не умели в сопроцессор, и ничего, работают поныне и софт к ним так же дописывается
поэтому мне неведомо насколько часто хочется в типичном гейпроекте ААА приводить float в int - неужели постоянно?
И все друг друга поняли?
...
FPU?
Floating Pitux Unit?
ты же в том же треде, у тебя снова симуляция диссоциативного расстройства идентичности?
У нормальных кодеров - никогда ;)
Округлить число по неким правилам - всяко часто. А "инт мне запили" - никогда. И если кто-то видит в (инт)4.5 "приведение флоата к целому" - он, имхо, упоротый идиот.
В си?
З.Ы. А в чем проблема вообще?
Есть разные виды округлений - в меньшую сторону, в большую, к нулю, банковское и т.п.
Одно из них непонятным образом (видимо подбрасив монетку) выбрали и сделали округлением по умолчанию, назвав "приведением флоата к инту".
Если кто-то в приведении флоата к инту видит не конкретный способ округления, принятый в данном языке, а неведомое "превращение флоата в инт" - он упорот.
Как вариант - можно выпилить нахер unsigned числа, и дать возможность указывать диапазон (в аде так и было?).
P.S. Жду недовольства сишников ;)
Запретить перегрузку операторов, добавить GC, убрать множественное наследование (за исключением чисто абстрактных классов), избавиться от системы с заголовочными файлами, и получится Ява
В яве тоже говно с модулями :( Не до конца довели идею, остановились на сраной неверсионированной помойке под названием CLASSPATH.
Вот в дотнете с их assembly уже близко к идеалу.
Никто за то не говорил.
>убрать множественное наследование (за исключением чисто абстрактных классов),
В сишке нет ООП.
>избавиться от системы с заголовочными файлами
А еще нормальные макросы, упрощения, женерики.
И получится простой, охуенный низкоуровневый язык который все ждали.
В JDK 8 пошли самым кошерным путём (не расширяя при этом язык), сделали методы (mul,div,toString) которые трактуют int, long как беззнаковые.
От unsigned проблем больше, имхо. Причем вот даже если борманд такое говорит.
если жава во что-то не умеет, то это автоматически становится ненужным, бугага
как ты собираешься представлять непрерывный бинарный поток, через signed char?
> Знаковый символ
Символ, имхо, вообще не надо смешивать с байтами. Это атавизм из старых добрых времен, когда кодировки были однобайтовыми. Поэтому только chr(), только ord(), только хардкор.
в жабе deque на 2.1 Gb - это как минимум 20 гигов памяти
т.е. уже по-любому 64-разрядная ОС и => uint64_t вновь ненужен
Ты хочешь запилить один массив на 2+ гигачара? Других случаев, когда тебе понадобится size_t >= 2^31 я не вижу.
-1 - сразу ясно, что это сознательно выставили значение "невозможный индекс", как НУЛЛ.
А в беззнаковом нету "НУЛЛ-индекса"(
Кто скажет про то, что меньше букв писать в проверке индекса - тот лох.
Тут видна подспудная ненависть Тараса к исключениям. И вот тут он как раз прав.
Так и у Тараса, после стопицотого улучшения Си выйдет Паскаль.
Если в слове "сишка" сделать 5 ошибок, то получится "говно".
Вернее я хотел сказать "кресты"
Про функции выше с "чёткой" семантикой шутку оценил. Тонко.
Надо запилить сайт, на котором будет по примеру на каждый UB из стандарта с++ ;)
Говнокод?
она же кьюююют
в студии кутэ тоже работает
дизайнер запускается, насколько я помню, отдельным окном, а так интеграция вполне себе на уровне, всякие эти ублюдошные moc из коробки по щелчку пальцев работают
Зато какая-никакая рефлексия. Классы по имени можно посоздавать, список свойств/слотов/инвокейблов у класса посмотреть, метод по имени инвокнуть и т.п. Тот же прилагаемый к Qt движок жабаскрипта юзает эту метаинфу, и любой QObject можно ему отдать на растерзание. За это, имхо, можно заплатить запуском препроцессора.
докатились до того, что без жабаскрипта крестогуйприложения уже не могут
хотя их и крестами назвать сложно-то
А типа для крестогуя есть альтернатива? :)
Унылые wxWidgets? Ночной кошмар под названием MFC? Остается только делфи++ с покорёженным для совместимости с VCL языком...
> без жабаскрипта крестогуйприложения уже не могут
Да, печальная тенденция с этим Qt. Понеслись семимильными шагами в сторону QML и мобильных платформ ломая старые виджеты к хуям :( Глядя на последние версии плакать хочется.
Сначала пытался допилить КуТ 5 приложение, но быстро это утомило, т.к. обилие школокода в нём зашкаливало, а понять логику создателей КуТ мне ну очень сложно.
Потом нашёл гномий аналог и допилил его. Но гномоделы оказались не менее упоротыми - для их поделок нужны распоследние версии гтк, не доступные даже на bleeding edge бубунте. А патчи они принимают в бугзиле эпохи динозавров и ну очень, очень нехотя.
В итоге пишу веб-аналог с Го-бэкэндом "чисто падсибя". Всего за несколько часов получилось запилить вполне себе работающий и полезный прототип. Ваяю нечёткий поиск по биграммам. Доволен как слон.
Десктоп приложения нинужны.
это то и печально, что альтернативы то и нет
на самом деле на безрыбье и рыбу раком
я в том смысле, что Qt вполне можно пользоваться, особенно по сравнению с MFC
Ну и что ты там ниасилил? Юзай - не хочу. Норм штука. Туда все движется.
P.S. Хотя не, выход есть - не писать такие задачи на крестах.