- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
printn(n,b) {
extern putchar;
auto a;
if(a=n/b) /* assignment, not test for equality */
printn(a, b); /* recursive */
putchar(n%b + '0');
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−45
printn(n,b) {
extern putchar;
auto a;
if(a=n/b) /* assignment, not test for equality */
printn(a, b); /* recursive */
putchar(n%b + '0');
}
в догонку к #19760. печатание числа `n` в base `b`. классический С образца 1972 года из UNIX v2. http://minnie.tuhs.org/cgi-bin/utree.pl?file=V2/lib/printf.c
ЗЫ http://minnie.tuhs.org/cgi-bin/utree.pl?file=V2/lib - printf.c единственный С код в библиотеке был!
ЗЗЫ это вам не энтерпрайз.
roman-kashitsyn 06.04.2016 15:21 # +4
Наверное, в те временя сишка воспринималась примерно как сейчас JS. Да и внешне даже немного похоже.
guesto 06.04.2016 15:28 # 0
может быть они были как раз в процессе переписки с асма на си
Dummy00001 06.04.2016 15:36 # 0
но для полноценной утилизации ресурсов без асма было сложно.
я думаю что проблема так же была что памяти было мало, софт стоил дорого, и специалисты тоже стоили дорого (потому что их было мало). почему разработка на асме была относительно дешевой.
guesto 06.04.2016 15:37 # +1
на ЯП высокого уровня писали всякую математику же
си был именно что первым языком который с одной стороны достаточно low level, чтобы напрямую работать с памятью и пр, с другой -- переносим на уровне исходного кода (ради чего и был запилен собственно)
roman-kashitsyn 06.04.2016 20:54 # +3
for some definition of "lisp"
Dummy00001 06.04.2016 15:37 # 0
Soul_re@ver 06.04.2016 17:01 # 0
Я впервые вижу реальное использование авто. А если его убрать? Компилятор не сможет в одновременное implicit int и implicit automatic storage duration?
3.14159265 07.04.2016 15:45 # 0
TarasB 07.04.2016 16:19 # +1
guesto 07.04.2016 16:27 # 0
bormand 06.04.2016 20:41 # +6
Вывод типов.
guesto 06.04.2016 20:51 # +4
обожаю переопределение одинаковых конструкций
другой такой пример #import в objc и у Microsoft
inkanus-gray 06.04.2016 21:35 # 0
Наверняка ещё препроцессор и бесовские макросы вообще не используются и ни одного #include нет?
guesto 06.04.2016 21:40 # +4
kurwa 06.04.2016 22:55 # +4
guesto 06.04.2016 23:05 # +5
return int
Dummy00001 06.04.2016 23:41 # +1
guesto 06.04.2016 23:44 # +1
по умолчанию
3.14159265 07.04.2016 15:49 # +1
inkanus-gray 08.04.2016 00:20 # +3
Пример из Бейсика:
Программа выводит 0.6, как и ожидалось.
А теперь сраная сишка:
Конпелируем и запускаем: http://ideone.com/ez38QA
Выводит -0.592199. Откуда взялось это число???
guest 08.04.2016 00:30 # 0
да, сишка ужасная
надо понимать что такое int, что такое float, ieee 754 вот еще голову забивать
inkanus-gray 08.04.2016 01:16 # +1
A% — целая переменная (аналог DIM A AS INTEGER, чтобы не рисовать процент, или DEFINT A, чтобы сделать все переменные на букву A целыми).
B& — длинная целая (DIM B AS LONG, DEFLNG B).
C! — вещественная (DIM C AS SINGLE, DEFSNG C).
D# — длинная вещественная (DIM D AS DOUBLE, DEFDBL D).
E$ — строковая (DIM E AS STRING, DEFSTR E).
Так что и в Бейсике приходилось забивать голову типами. Но в Бейсике почему-то из 3/5 автоматически выводился нужный тип, а в сишке нет.
guest 08.04.2016 01:49 # 0
видимо ты более лучше меня в бейские разбираешься
Steve_Brown 08.04.2016 11:12 # 0
inkanus-gray 08.04.2016 18:06 # 0
guest 08.04.2016 21:08 # 0
много разных бейсиков есть на свете
хороший программист должен уметь все
и DONKEY.BAS
Antervis 11.04.2016 06:45 # 0
guest 24.06.2016 11:57 # 0
4e1 08.04.2016 01:20 # 0
http://coliru.stacked-crooked.com/a/a12c1809a617aa7d
j123123 08.04.2016 04:44 # +1
j123123 08.04.2016 04:32 # +5
от незнания сишечки, соглашений вызова в х86 и принтф-а, очевидно жэ. Там "%f\n" ожидает плавчуку, а не какой-то int, причем плавучку оно хочет получить в FPU говностеке, а т.к. мы передаем не плавучку а инт какой-то сраный, то в стек оно вообще не записывается. В стеке для плавучки лежит какая-то срань непонятная, вот она и выводится. При этом совершенно насрать на то говно, которое передается в printf в качестве второго аргумента. https://ideone.com/Jy0WcV
inkanus-gray 08.04.2016 18:08 # +1
По внешнему виду вызова функции printf такое поведение вовсе не очевидно.
j123123 09.04.2016 03:35 # +2
inkanus-gray 09.04.2016 12:12 # +10
Когда я пишу на языках действительно высокого уровня, мне не приходится думать о регистрах, поэтому тоже вопросов не возникает.
А сишка — это кентавр наоборот, с человеческими ногами и с лошадиной головой. Она сочетает скорость человека с интеллектом коня. Т. е. управлять регистрами я не могу, но мне приходится о них думать.
guest 09.04.2016 12:27 # +5
-Че, ноги кривые?
-Да нет. Рожа лошадиная!
j123123 09.04.2016 13:15 # +2
Что тогда представляют из себя плюсы? Там ведь тоже есть printf, и тоже будут такие вот проблемы, если в printf писать всякое говно
inkanus-gray 09.04.2016 13:26 # +2
Следующие плюсы будут похожи на PHP. Так вижу.
http://black-007.com/images/56b6d6ac2c964.jpg
guest 09.04.2016 14:42 # +1
о лямбда исчислении я знаю немногим больше чем то, что оно существует, но, разве оно имеет место быть в крестах?
kurwa 09.04.2016 15:53 # 0
roman-kashitsyn 09.04.2016 16:38 # +1
Вообще говоря, об этом даже Мейерс писал в Effective C++.
Item 1: View C++ as a federation of languages.
j123123 09.04.2016 16:23 # +1
Что еще за исчисление лямбд? Туда просто добавили такой новый способ объявить анонимную функцию внутри функции, которая еще может захватывать какие-то там переменные. Ничего существенно нового эти лямбды не добавляют. Они там даже могут быть mutable т.е. изменять ту хрень, которая в них передана
kegdan 09.04.2016 16:35 # 0
guest 09.04.2016 16:47 # +1
ну так и пишите: кложи
а то лямбды, хуямбды
inkanus-gray 09.04.2016 16:48 # 0
Тогда выручайте. Должно же что-нибудь быть в C++14, что не укладывается в стройную картину предыдущих крестов и при этом имеет самостоятельное значение.
bormand 09.04.2016 16:48 # +1
Dummy00001 09.04.2016 16:50 # +3
это блин какая-то функциональщина уже, блин.
roman-kashitsyn 09.04.2016 17:37 # +2
Шаблонное метапрограммирование испокон веков было функциональщиной без сборщика мусора. Поэтому его так легко понимать после haskell.
bormand 09.04.2016 17:44 # +1
Вот это и самое обидное - только начал метапрограммировать, а 16 гиг уже закончились...
kegdan 10.04.2016 11:42 # 0
fixed
guest 09.04.2016 17:51 # 0
нужно встроить в язык AOP
guest 09.04.2016 16:54 # +2
guest 09.04.2016 16:48 # +3
Vasiliy 10.04.2016 10:40 # 0
3.14159265 24.06.2016 17:32 # 0
Я об этом уже который год говорю.
Спасибо некромантам за оживление годного треда. Методично проставил @ inkanus-gray плюсы.
3.14159265 24.06.2016 17:40 # 0
Франкенштейна же.
http://www.simpsoncrazy.com/content/pictures/onetimers/FrinkSr.gif
LispGovno 25.06.2016 03:39 # 0
https://m.reddit.com/r/cpp/comments/4pmlpz/what_the_iso_c_committee_added_to_the_c1 7_working/
Antervis 11.04.2016 06:51 # +2
inkanus-gray 11.04.2016 11:09 # 0
guest 08.04.2016 21:07 # 0
я вот думаю что он честно делает fld или как там его, просто туда попадает int, чье представление немного отлично от float
j123123 09.04.2016 03:31 # +1
j123123 09.04.2016 04:42 # +2
gcc -O2 -m32 -S test.c
guest 09.04.2016 04:58 # 0
j123123 09.04.2016 05:01 # 0
guest 09.04.2016 16:50 # 0
bormand 09.04.2016 17:02 # 0
А зачем целый регистр тратить на нахуй никому не нужный фреймпоинтер?
guest 09.04.2016 17:16 # 0
известно же зачем
bormand 09.04.2016 17:17 # 0
Кому это надо кроме реверсеров? Да и та же IDA вполне умеет трекать переменные по ESP.
guest 09.04.2016 17:19 # 0
bormand 09.04.2016 17:34 # 0
По ret'у же. Конпелятор никуда не денется, всё лишнее уберёт перед ret'ом.
Ну или по точке входа, когда esp ещё никуда уплыть не успел.
Олсо, у её анализатора таки крышу сносит, если прога делает какие-нибудь непонятные трюки с esp посреди функции.
guest 09.04.2016 17:52 # 0
а с ебп там был просто лист же
bormand 09.04.2016 18:29 # 0
Ну и отладка без символов - имхо, не самый приоритетный кейс. А вот лишний регистр на x86, где их не так уж много, весьма ценен.
guest 09.04.2016 18:33 # 0
bormand 09.04.2016 18:35 # 0
Да даже на amd64, где регистров побольше, этот фреймпоинтер только зря будет такты жрать на входе и выходе процедуры...
guest 09.04.2016 18:36 # 0
но с висты уже собирает с ним
и линксы тоже
j123123 09.04.2016 04:42 # +3
Но хуй там https://paste.debian.net/hidden/0a0b3ee3/
Как можно видеть из этого говнопримера (тестировалось это говно на Ubuntu 14.04.4 LTS 64bit с дефолным gcc) этому __printf_chk насрать на хуйню, записанную в обычный стек, когда оно хочет вывести плавучку. Несмотря на то, что плавучее говно пишется и в обычный стек, оно его все равно берет из плавучего стека. И таким образом, этот test1.с выводит на оба случая число 1.000000 т.к. после функци test1() в стеке осталось насрано числом 1.000000, а test2() просто находит в стеке это говно и выводит его. А в случае test2.с в стеке насрано чем-то другим, и функция test2() запускается первее, каждый раз выводит какое-то новое случайное говно, которое оказалось в говноплавучем стеке
Dummy00001 11.04.2016 12:00 # +2
не стоит забывать что это специальный случай: передача параметров в va-args функцию.
*ABI для i386 под рукой нет.*
я слышал что там была новая версия ABI, так как народ решил забить на поддержку оригинальных i386-i586 процов. может быть там что-то поменялось.
ЗЫ не уверен что это оно - https://01.org/sites/default/files/file_attach/intel386-psabi-1.0.pdf - но похоже на это. капипаста из оригинального http://www.sco.com/developers/devspecs/abi386-4.pdf которая ничего не говорит. (даже то что типы промотятся не говорится. мля.)
gost 07.04.2016 09:18 # +1
guest 24.06.2016 12:02 # 0
guest 24.06.2016 09:27 # +4
https://en.wikipedia.org/wiki/B_%28programming_language%29
Dummy00001 24.06.2016 12:02 # 0