- 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 единственный С код в библиотеке был!
ЗЗЫ это вам не энтерпрайз.
Наверное, в те временя сишка воспринималась примерно как сейчас JS. Да и внешне даже немного похоже.
может быть они были как раз в процессе переписки с асма на си
но для полноценной утилизации ресурсов без асма было сложно.
я думаю что проблема так же была что памяти было мало, софт стоил дорого, и специалисты тоже стоили дорого (потому что их было мало). почему разработка на асме была относительно дешевой.
на ЯП высокого уровня писали всякую математику же
си был именно что первым языком который с одной стороны достаточно low level, чтобы напрямую работать с памятью и пр, с другой -- переносим на уровне исходного кода (ради чего и был запилен собственно)
for some definition of "lisp"
Я впервые вижу реальное использование авто. А если его убрать? Компилятор не сможет в одновременное implicit int и implicit automatic storage duration?
Вывод типов.
обожаю переопределение одинаковых конструкций
другой такой пример #import в objc и у Microsoft
Наверняка ещё препроцессор и бесовские макросы вообще не используются и ни одного #include нет?
return int
по умолчанию
Пример из Бейсика:
Программа выводит 0.6, как и ожидалось.
А теперь сраная сишка:
Конпелируем и запускаем: http://ideone.com/ez38QA
Выводит -0.592199. Откуда взялось это число???
да, сишка ужасная
надо понимать что такое int, что такое float, ieee 754 вот еще голову забивать
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 автоматически выводился нужный тип, а в сишке нет.
видимо ты более лучше меня в бейские разбираешься
много разных бейсиков есть на свете
хороший программист должен уметь все
и DONKEY.BAS
http://coliru.stacked-crooked.com/a/a12c1809a617aa7d
от незнания сишечки, соглашений вызова в х86 и принтф-а, очевидно жэ. Там "%f\n" ожидает плавчуку, а не какой-то int, причем плавучку оно хочет получить в FPU говностеке, а т.к. мы передаем не плавучку а инт какой-то сраный, то в стек оно вообще не записывается. В стеке для плавучки лежит какая-то срань непонятная, вот она и выводится. При этом совершенно насрать на то говно, которое передается в printf в качестве второго аргумента. https://ideone.com/Jy0WcV
По внешнему виду вызова функции printf такое поведение вовсе не очевидно.
Когда я пишу на языках действительно высокого уровня, мне не приходится думать о регистрах, поэтому тоже вопросов не возникает.
А сишка — это кентавр наоборот, с человеческими ногами и с лошадиной головой. Она сочетает скорость человека с интеллектом коня. Т. е. управлять регистрами я не могу, но мне приходится о них думать.
-Че, ноги кривые?
-Да нет. Рожа лошадиная!
Что тогда представляют из себя плюсы? Там ведь тоже есть printf, и тоже будут такие вот проблемы, если в printf писать всякое говно
Следующие плюсы будут похожи на PHP. Так вижу.
http://black-007.com/images/56b6d6ac2c964.jpg
о лямбда исчислении я знаю немногим больше чем то, что оно существует, но, разве оно имеет место быть в крестах?
Вообще говоря, об этом даже Мейерс писал в Effective C++.
Item 1: View C++ as a federation of languages.
Что еще за исчисление лямбд? Туда просто добавили такой новый способ объявить анонимную функцию внутри функции, которая еще может захватывать какие-то там переменные. Ничего существенно нового эти лямбды не добавляют. Они там даже могут быть mutable т.е. изменять ту хрень, которая в них передана
ну так и пишите: кложи
а то лямбды, хуямбды
Тогда выручайте. Должно же что-нибудь быть в C++14, что не укладывается в стройную картину предыдущих крестов и при этом имеет самостоятельное значение.
это блин какая-то функциональщина уже, блин.
Шаблонное метапрограммирование испокон веков было функциональщиной без сборщика мусора. Поэтому его так легко понимать после haskell.
Вот это и самое обидное - только начал метапрограммировать, а 16 гиг уже закончились...
fixed
нужно встроить в язык AOP
Я об этом уже который год говорю.
Спасибо некромантам за оживление годного треда. Методично проставил @ inkanus-gray плюсы.
Франкенштейна же.
http://www.simpsoncrazy.com/content/pictures/onetimers/FrinkSr.gif
https://m.reddit.com/r/cpp/comments/4pmlpz/what_the_iso_c_committee_added_to_the_c1 7_working/
я вот думаю что он честно делает fld или как там его, просто туда попадает int, чье представление немного отлично от float
gcc -O2 -m32 -S test.c
А зачем целый регистр тратить на нахуй никому не нужный фреймпоинтер?
известно же зачем
Кому это надо кроме реверсеров? Да и та же IDA вполне умеет трекать переменные по ESP.
По ret'у же. Конпелятор никуда не денется, всё лишнее уберёт перед ret'ом.
Ну или по точке входа, когда esp ещё никуда уплыть не успел.
Олсо, у её анализатора таки крышу сносит, если прога делает какие-нибудь непонятные трюки с esp посреди функции.
а с ебп там был просто лист же
Ну и отладка без символов - имхо, не самый приоритетный кейс. А вот лишний регистр на x86, где их не так уж много, весьма ценен.
Да даже на amd64, где регистров побольше, этот фреймпоинтер только зря будет такты жрать на входе и выходе процедуры...
но с висты уже собирает с ним
и линксы тоже
Но хуй там https://paste.debian.net/hidden/0a0b3ee3/
Как можно видеть из этого говнопримера (тестировалось это говно на Ubuntu 14.04.4 LTS 64bit с дефолным gcc) этому __printf_chk насрать на хуйню, записанную в обычный стек, когда оно хочет вывести плавучку. Несмотря на то, что плавучее говно пишется и в обычный стек, оно его все равно берет из плавучего стека. И таким образом, этот test1.с выводит на оба случая число 1.000000 т.к. после функци test1() в стеке осталось насрано числом 1.000000, а test2() просто находит в стеке это говно и выводит его. А в случае test2.с в стеке насрано чем-то другим, и функция test2() запускается первее, каждый раз выводит какое-то новое случайное говно, которое оказалось в говноплавучем стеке
не стоит забывать что это специальный случай: передача параметров в 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 которая ничего не говорит. (даже то что типы промотятся не говорится. мля.)
https://en.wikipedia.org/wiki/B_%28programming_language%29