- 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
LispGovno 09.02.2014 16:00 # +1
bormand 09.02.2014 16:25 # +2
Хм, у меня 11 вывело, как я и ожидал.
bormand 09.02.2014 16:32 # +2
Баг gcc? Или так и положено по стандарту?
bormand 09.02.2014 16:39 # +6
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 постоянно ругается.
bormand 09.02.2014 16:50 # +5
Soul_re@ver 09.02.2014 19:56 # +3
Вывод: видим при компиляции, что происходит переполнение — заменяем жёстко на UCHAR_MAX. В рантайме — как байты лягут.
Отличный пример. Утащил для наглядной демонстрации UB.
Кстати, а что альтернативные компиляторы? Студия ругается? и ввести 267, то выйдет 11 даже на О2.
LispGovno 09.02.2014 20:05 # 0
> std::cin >> f;
http://ideone.com/nvjdXC
Где UB?
Soul_re@ver 09.02.2014 20:29 # 0
LispGovno 09.02.2014 20:38 # 0
Soul_re@ver 09.02.2014 20:42 # 0
http://ideone.com/LbogiH
Как Борманд выше сказал, нужно компилировать с -Wconversion, чтобы получить варнинг.
LispGovno 09.02.2014 21:09 # +2
Soul_re@ver 09.02.2014 21:14 # +3
Вообще не хватает опции -Weverything
TarasB 09.02.2014 21:19 # +10
-Weverything
-Wreallyeverything
-Weverythingandskyandallah
WGH 10.02.2014 01:21 # +2
Получил сотни подобных ворнингов:
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
LispGovno 10.02.2014 01:30 # +4
3.14159265 10.02.2014 02:13 # +4
bormand 10.02.2014 05:53 # +4
Просто студия не умеет разделять ворнинги на пользовательские и системные. И показывает юзеру тонны ворнингов из своих же хидеров.
gcc по дефолту так не делает, и поэтому там нет этой проблемы с портянкой бесполезных предупреждений.
Soul_re@ver 10.02.2014 10:47 # +1
#pragma GCC system_header
Если я не ошибаюсь буст так же подавляет варнинги в себе
anonimb84a2f6fd141 10.02.2014 13:05 # −1
Почему header читается как хидер?
bormand 10.02.2014 13:43 # +2
WGH 10.02.2014 13:50 # 0
bormand 10.02.2014 14:09 # 0
WGH 10.02.2014 14:15 # 0
Ближе к GCC'шному -Wall будет, пожалуй, /W4.
TarasB 10.02.2014 09:27 # 0
LispGovno 10.02.2014 00:32 # 0
3.14159265 10.02.2014 02:18 # +5
Человеку много пишущему/компиляющему на крестах надо знать как таблицу умножения. Имхо азы.
Откройте же для себя наконец SO.
http://stackoverflow.com/a/3376483
http://stackoverflow.com/questions/154630/recommended-gcc-warning-options-for-c
laMer007 10.02.2014 09:08 # +2
-Weffc++
-Pedantic
?
bormand 10.02.2014 09:33 # +6
laMer007 10.02.2014 09:35 # 0
TarasB 10.02.2014 19:37 # +3
LispGovno 10.02.2014 20:58 # +1
TarasB 13.02.2014 14:11 # 0
3.14159265 10.02.2014 11:50 # 0
bormand 09.02.2014 21:14 # +1
Ну а список ворнингов есть на сайте gcc, выбери те, которые не будут тебя бесить ;)
TarasB 09.02.2014 21:18 # +4
Особенно про неявный каст инта в флоат. Я считаю, что тот, кто брезгует явно приводить тип - недостойный говнокодер.
bormand 09.02.2014 21:32 # +8
А смысл? Ну будут люди на автомате бездумно втыкать касты где надо и где не надо... Никаких проблем это не решает. Разве что страхует от случайных опечаток.
А каст одинаково плох что в явной форме, что в неявной - он скрывает семантику преобразования. Тот же каст флоата в инт - что он должен олицетворять? floor? ceil? round? Банковское округление? Каст целого в меньшее - обрезать биты, подставить максимум, или вообще кинуть исключение? Каст числа в строку - как именно форматировать ее? Каст чего-то в бул - почему именно эти значения являются false? Особенно это касается слабой тупизации аля PHP, где "0" считается за false, "0.0" за true, а 0.0 за false.
Так что все касты (включая явные) надо тупо закопать, а вместо них дать набор функций с четкой и ясной семантикой.
bormand 09.02.2014 21:52 # 0
Ну и dynamic_cast оставить, т.к. он и есть та самая функция с понятной семантикой. И заменить его нечем.
3.14159265 10.02.2014 11:57 # +1
Это тоже не надо. От тупого присваивания беды не будет, а вот от логических битоебских операций между лонгом и интом я когда-то пострадал.
int a=3;
<.дохера кода.>
long mask=3<<shift; //где shift [0..63]
long res=mask & a; //лучше бы тут был ворнинг
Psionic 14.02.2014 12:59 # 0
TarasB 14.02.2014 14:29 # 0
если shift хотя бы 32, то res обнуляется, да?
И вообще если shift хотя бы 2, то res обнуляется.
А что не так-то?
bormand 14.02.2014 14:45 # 0
Нет. Сдвиг на число, большее нежели разрядность - в крестах и сишке 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..
TarasB 14.02.2014 14:48 # 0
bormand 14.02.2014 14:54 # +1
Да, об этом и говорил Пи. Если бы не было неявного каста инта в лонг - компилятор бы его обматерил. А т.к. неявный каст есть - сдвинуло инт как попало, а потом привело к лонгу.
Abbath 10.02.2014 00:31 # 0
3.14159265 10.02.2014 03:33 # +2
Как это гуглить начинающему?
>>Так что все касты (включая явные) надо тупо закопать, а вместо них дать набор функций с четкой и ясной семантикой.
Да-да-да. +100500.
Функции и гуглятся, и семантика определена, и каст в целом сахар от которого толстеет язык.
Сахар, который можно заменить стандартным средством композиции.
3.14159265 10.02.2014 03:37 # 0
SomeAbstractShit a=cast(b).getA();
чем
SomeAbstractShit a=((SomeAbstractShit) b).getA();
Посему выжигать сишкоблядское наследие.
roman-kashitsyn 10.02.2014 08:59 # 0
b.(SomeType).GetA()
LispGovno 10.02.2014 08:59 # +2
3.14159265 10.02.2014 11:51 # 0
defecate-plusplus 10.02.2014 07:36 # +2
в любом случае, за пределами гейдева (в это сложно поверить) существует огромный пласт задач, в которых плавающий питух ненужен вообще - у меня на старой работе даже был класс устройств, которые не умели в сопроцессор, и ничего, работают поныне и софт к ним так же дописывается
поэтому мне неведомо насколько часто хочется в типичном гейпроекте ААА приводить float в int - неужели постоянно?
TarasB 10.02.2014 09:28 # 0
laMer007 10.02.2014 09:37 # +1
И все друг друга поняли?
...
FPU?
Floating Pitux Unit?
defecate-plusplus 10.02.2014 09:52 # +1
ты же в том же треде, у тебя снова симуляция диссоциативного расстройства идентичности?
3.14159265 10.02.2014 11:58 # +3
anonimb84a2f6fd141 10.02.2014 13:02 # 0
bormand 10.02.2014 09:42 # +1
У нормальных кодеров - никогда ;)
Округлить число по неким правилам - всяко часто. А "инт мне запили" - никогда. И если кто-то видит в (инт)4.5 "приведение флоата к целому" - он, имхо, упоротый идиот.
laMer007 10.02.2014 09:45 # +4
bormand 10.02.2014 10:11 # +1
Abbath 10.02.2014 09:58 # +1
bormand 10.02.2014 10:16 # 0
laMer007 10.02.2014 10:36 # 0
bormand 10.02.2014 10:43 # 0
В си?
laMer007 10.02.2014 10:44 # 0
Psionic 14.02.2014 11:00 # 0
З.Ы. А в чем проблема вообще?
TarasB 14.02.2014 11:09 # +3
bormand 14.02.2014 11:16 # 0
Есть разные виды округлений - в меньшую сторону, в большую, к нулю, банковское и т.п.
Одно из них непонятным образом (видимо подбрасив монетку) выбрали и сделали округлением по умолчанию, назвав "приведением флоата к инту".
Если кто-то в приведении флоата к инту видит не конкретный способ округления, принятый в данном языке, а неведомое "превращение флоата в инт" - он упорот.
bormand 09.02.2014 22:04 # +1
Как вариант - можно выпилить нахер unsigned числа, и дать возможность указывать диапазон (в аде так и было?).
P.S. Жду недовольства сишников ;)
Soul_re@ver 09.02.2014 22:12 # +3
Запретить перегрузку операторов, добавить GC, убрать множественное наследование (за исключением чисто абстрактных классов), избавиться от системы с заголовочными файлами, и получится Ява
bormand 09.02.2014 22:27 # +2
В яве тоже говно с модулями :( Не до конца довели идею, остановились на сраной неверсионированной помойке под названием CLASSPATH.
Вот в дотнете с их assembly уже близко к идеалу.
3.14159265 10.02.2014 03:40 # 0
Никто за то не говорил.
>убрать множественное наследование (за исключением чисто абстрактных классов),
В сишке нет ООП.
>избавиться от системы с заголовочными файлами
А еще нормальные макросы, упрощения, женерики.
И получится простой, охуенный низкоуровневый язык который все ждали.
3.14159265 10.02.2014 03:43 # 0
В JDK 8 пошли самым кошерным путём (не расширяя при этом язык), сделали методы (mul,div,toString) которые трактуют int, long как беззнаковые.
От unsigned проблем больше, имхо. Причем вот даже если борманд такое говорит.
defecate-plusplus 10.02.2014 07:20 # 0
если жава во что-то не умеет, то это автоматически становится ненужным, бугага
как ты собираешься представлять непрерывный бинарный поток, через signed char?
bormand 10.02.2014 10:19 # 0
laMer007 10.02.2014 10:35 # 0
bormand 10.02.2014 10:45 # +2
> Знаковый символ
Символ, имхо, вообще не надо смешивать с байтами. Это атавизм из старых добрых времен, когда кодировки были однобайтовыми. Поэтому только chr(), только ord(), только хардкор.
LispGovno 10.02.2014 08:58 # 0
defecate-plusplus 10.02.2014 09:49 # +3
в жабе deque на 2.1 Gb - это как минимум 20 гигов памяти
т.е. уже по-любому 64-разрядная ОС и => uint64_t вновь ненужен
bormand 10.02.2014 10:27 # 0
Ты хочешь запилить один массив на 2+ гигачара? Других случаев, когда тебе понадобится size_t >= 2^31 я не вижу.
TarasB 10.02.2014 10:48 # +2
-1 - сразу ясно, что это сознательно выставили значение "невозможный индекс", как НУЛЛ.
А в беззнаковом нету "НУЛЛ-индекса"(
Кто скажет про то, что меньше букв писать в проверке индекса - тот лох.
3.14159265 10.02.2014 11:53 # 0
Тут видна подспудная ненависть Тараса к исключениям. И вот тут он как раз прав.
TarasB 10.02.2014 12:03 # 0
Soul_re@ver 10.02.2014 12:27 # 0
Vindicar 13.02.2014 14:01 # +3
Так и у Тараса, после стопицотого улучшения Си выйдет Паскаль.
3.14159265 13.02.2014 14:33 # 0
Если в слове "сишка" сделать 5 ошибок, то получится "говно".
3.14159265 13.02.2014 14:43 # 0
Вернее я хотел сказать "кресты"
TarasB 13.02.2014 14:43 # −1
inkanus-gray 09.02.2014 21:34 # 0
bormand 09.02.2014 21:35 # +5
LispGovno 10.02.2014 00:30 # +1
Про функции выше с "чёткой" семантикой шутку оценил. Тонко.
bormand 09.02.2014 20:06 # +5
Надо запилить сайт, на котором будет по примеру на каждый UB из стандарта с++ ;)
LispGovno 09.02.2014 20:08 # 0
Говнокод?
crastinus 09.02.2014 20:29 # +6
3.14159265 10.02.2014 02:11 # 0
bormand 10.02.2014 10:47 # 0
3.14159265 10.02.2014 02:14 # +6
anonimb84a2f6fd141 10.02.2014 10:28 # +1
anonimb84a2f6fd141 10.02.2014 13:07 # −1
kegdan 10.02.2014 13:13 # 0
Stertor 10.02.2014 13:38 # 0
kegdan 10.02.2014 13:43 # +1
она же кьюююют
anonimb84a2f6fd141 10.02.2014 14:58 # −1
roman-kashitsyn 10.02.2014 15:04 # +1
defecate-plusplus 10.02.2014 15:33 # 0
в студии кутэ тоже работает
дизайнер запускается, насколько я помню, отдельным окном, а так интеграция вполне себе на уровне, всякие эти ублюдошные moc из коробки по щелчку пальцев работают
bormand 10.02.2014 15:40 # 0
Зато какая-никакая рефлексия. Классы по имени можно посоздавать, список свойств/слотов/инвокейблов у класса посмотреть, метод по имени инвокнуть и т.п. Тот же прилагаемый к Qt движок жабаскрипта юзает эту метаинфу, и любой QObject можно ему отдать на растерзание. За это, имхо, можно заплатить запуском препроцессора.
defecate-plusplus 10.02.2014 15:44 # 0
докатились до того, что без жабаскрипта крестогуйприложения уже не могут
хотя их и крестами назвать сложно-то
bormand 10.02.2014 16:01 # +1
А типа для крестогуя есть альтернатива? :)
Унылые wxWidgets? Ночной кошмар под названием MFC? Остается только делфи++ с покорёженным для совместимости с VCL языком...
> без жабаскрипта крестогуйприложения уже не могут
Да, печальная тенденция с этим Qt. Понеслись семимильными шагами в сторону QML и мобильных платформ ломая старые виджеты к хуям :( Глядя на последние версии плакать хочется.
roman-kashitsyn 10.02.2014 16:10 # +1
Сначала пытался допилить КуТ 5 приложение, но быстро это утомило, т.к. обилие школокода в нём зашкаливало, а понять логику создателей КуТ мне ну очень сложно.
Потом нашёл гномий аналог и допилил его. Но гномоделы оказались не менее упоротыми - для их поделок нужны распоследние версии гтк, не доступные даже на bleeding edge бубунте. А патчи они принимают в бугзиле эпохи динозавров и ну очень, очень нехотя.
В итоге пишу веб-аналог с Го-бэкэндом "чисто падсибя". Всего за несколько часов получилось запилить вполне себе работающий и полезный прототип. Ваяю нечёткий поиск по биграммам. Доволен как слон.
bormand 10.02.2014 16:17 # +2
Десктоп приложения нинужны.
defecate-plusplus 10.02.2014 16:17 # +2
defecate-plusplus 10.02.2014 16:14 # +1
это то и печально, что альтернативы то и нет
на самом деле на безрыбье и рыбу раком
я в том смысле, что Qt вполне можно пользоваться, особенно по сравнению с MFC
LispGovno 10.02.2014 18:21 # 0
Ну и что ты там ниасилил? Юзай - не хочу. Норм штука. Туда все движется.
bormand 10.02.2014 16:05 # 0
P.S. Хотя не, выход есть - не писать такие задачи на крестах.