SII согласен только не я начинал холивар, я всего лишь ответил на один из постов, кодеров на паскалей, с просьбой привести код на Си. Просто на работе скучно, решил размяться во флейме. Ну если есть у кого то желание - то готов продолжать холивар bugaga Это перегрузка, она ничего не имеет общего с переменным числом параметром такие фичи учат на Си практически на первых уроках SII № 159 Никакой сложной читабельности в таких конструкциях нет, конечно же если надо писать километры кода - тогда да а когда нужно инициализировать две переменных, одна для начала массива, другая для конца массива, для одной задать прирощение +1, для другой -1 то такая запись будет очень и очень читабельна. Давайте не будем углубляться, что взяли С++ и Делфи из таких языков как Алгол, счас важнее то, что они берут друг от друга. А наблюдаем очень простую картину, как развивался делфи, сначала появились параметры по умолчанию, потом перегрузка
1) На клаву давить меньше надо 2) Ум дисциплинирует А за читабельность кода... Ни в Pascal ни в С нечего делать без комментариев. Делаешь так. Пишешь перед циклом комментарии- что в первом поле делается, что во втором, что в третьем, зачем переменные инкременируются и так далее. Читаешь и всё понимаешь. Вся читабельность.
а в си естьoperator , она затмит собою все поскалевские достижения! ^_^ ps: хотя даже осьмнадцатилетнему любому детине ясно что сейчас стОит программировать лишь на Лиспе и только на нём.
GoldFinch Извините, format - это аналог функции sprintf например но никак не образец пользовательской функции с переменным числом параметров. Могли б в качестве примера привести функцию Writeln что б далеко не рыскать
int main(){ char a [24]; int i= 0; a [0]= 67; while (a< 91&& i< 24) { a [i+1]= a[i++]+ 1; } return 0; } Можно было массив и явно инициализировать. Но этот код можно оформить в виде функции и употреблять где надо. Будет не длинее чем в Pascal объявление массива. Я за С, кто не понял. ... А можно было инициаоизацию и так написать: int main(){ char a [24]; int i= 0; a [0]= 67; while ((a[i+1]= a[i++]+ 1) < 91&& i< 24) { }; return 0; } Это я прикалываюсь. Но работает... Видишь, я кручу как хочу тем, что знаю и умею. Вот она, свобода. Но комментарии всё равно всегда пишу. Кстати. Для читабельности. А можно было бы и максимально читабельным код сделать. Писать i= i+1 вместо i++ Cмотрите сами, в общем.
Для меня, как потребителя функции printf это не имеет ни какого значения, поскоку юзаться одно имя ф-кции, а стек пушиццо разное число и тип параметров. Code (Text): 00401E9B: E80CFFFFFF call .000401DAC 00401EA0: 68E41E4000 push 000401EE4 00401EA5: E87EFFFFFF call printf ;msvcrt 00401EAA: 59 pop ecx 00401EAB: 6878563412 push 012345678 00401EB0: 68EC1E4000 push 000401EEC 00401EB5: E876FFFFFF call printf ;msvcrt 00401EBA: 83C408 add esp,008 00401EBD: DB2DF41E4000 fld t,[00401EF4] 00401EC3: E850F3FFFF call .000401218 ;sin 00401EC8: 83C4F8 add esp,-008 00401ECB: DD1C24 fstp q,[esp] 00401ECE: 9B fwait 00401ECF: 68001F4000 push 000401F00 00401ED4: E85FFFFFFF call printf ;msvcrt 00401ED9: 83C40C add esp,00C ; Так что все претензии идут лесом. Его преимущества проявляються разве что на число-дробильном коде. Code (Text): 0040136C: F30F110424 movss [esp],xmm0 00401371: F30F11442404 movss [esp][04],xmm0 00401377: F30F11442408 movss [esp][08],xmm0 0040137D: FF15A024D400 call glColor3f ;OPENGL32 00401383: 83C4F4 add esp,-00C 00401386: 0FB60E movzx ecx,b,[esi] 00401389: F30F2AD9 cvtsi2ss xmm3,ecx 0040138D: 0FB64E01 movzx ecx,b,[esi][01] 00401391: F30F111C24 movss [esp],xmm3 00401396: F30F2AE1 cvtsi2ss xmm4,ecx 0040139A: F30F11642404 movss [esp][04],xmm4 004013A0: 0FB64E02 movzx ecx,b,[esi][02] 004013A4: F30F2AC1 cvtsi2ss xmm0,ecx 004013A8: F30F11442408 movss [esp][08],xmm0 004013AE: FF15B824D400 call glVertex3f ;OPENGL32 И то, компиль не настока умен чтоб юзать пакеты скаляров, вмест одиночных. А на прикладухе почти такой же оптимайз как и у дельфе Code (Text): 00402E74: FF157C25D400 call ShowWindow ;USER32 00402E7A: FF355C0ED400 push d,[00D40E5C] 00402E80: FF158425D400 call UpdateWindow ;USER32 00402E86: FF355C0ED400 push d,[00D40E5C] 00402E8C: FF158025D400 call GetDC ;USER32 00402E92: 8BF0 mov esi,eax 00402E94: 33D2 xor edx,edx 00402E96: 6A42 push 042 00402E98: FF354C0ED400 push d,[00D40E4C] 00402E9E: FF35480ED400 push d,[00D40E48] 00402EA4: 52 push edx 00402EA5: 52 push edx 00402EA6: 56 push esi 00402EA7: FF154823D400 call PatBlt ;GDI32 00402EAD: 56 push esi 00402EAE: FF355C0ED400 push d,[00D40E5C] 00402EB4: FF157025D400 call ReleaseDC ;USER32 00402EBA: 8B8588744400 mov eax,[ebp][00447488] 00402EC0: 8B0D940ED400 mov ecx,[00D40E94] Да и смысл, мега-оптимайзить то что все равно потонет в тормозах RTL/API? (ммм... хстате фишку с xor-ом для пуша нолей дельфе тож использует =))) А вообще параметры мне както привычней иметь в 3-ёх регистрах в fastcall -овых вызовах, которые у дельфе по дефолту. В eax, edx, ecx. Все побыстрее и полутше, чем через стек, да и более по ассемблерски, да.
А вот камень насчет читаемости кода в паскале и в с на Си: res = f1; // присваивание переменной res = f2(); // вызов функции без параметров res = f3(2); // вызов функции с параметрами тут все предельная ясно: скобки есть - значит вызывается функция, нет скобок - обычная переменная. На паскале: res := f1; // присваивание переменной res := f2; // вызов функции без параметров res := f3(2); // вызов функции с параметрами и чем в паскале вызов функции без параметров отличается от простого присваивания переменной? без поллитра не разобраться ну просто "отличная" читаемость кода.
beginner writeln это скорее оператор чем функция а если у тя есть функция f2 и переменная f1, могу только посочувствовать
GoldFinch ага, что ты имел ввиду? компилятор прекрасно выдаст сообщение об ошибке тока вопрос не в этом по синтаксису в паскале вызов функции без параметров и присваивание переменной - абсолютно ничем не отличаются. И это в языке, который позиционируется для обучения... представляю, как будет "легко" начинающему программисту разбираться в подобном коде. )))) Интересно, так Writeln - оператор или функция? Пациент скорее жив, чем мертв? )) Похоже те кто придумал паскаль, сами не знают что это такое ))
beginner Я имею в виду, что различие между функцией и переменной должно заключаться в ее названии. Если идентификаторы имеют осмысленные названия, никакой путаницы не возникнет. Однобуквенное имя+цифра для функции - это не есть хорошо, а для переменной это хорошо только если эта буква несет какой-то смысл, как то x1,z3,... Я думаю следует называть подпрограммой (процедурой\функцией) - обособленный кусок кода, который вызывается в другом коде, и куда передаются параметры. А оператором - то что не вызывается, а компилируется на месте. Так вот в паскале writeln("1",2) не компилируется как вызов подпрограммы "writeln" с параметрами ("1",2), а компилируется как последовательность вызовов внутренних подпрограмм языка, для каждого случая разных. Алсо abs() sqrt() - это операторы, а не подпрограммы.
GoldFinch кудато вас занесло не в ту степь однобуквенные названия - это всего лишь пример, на их месте могут быть любые осмысленные названия. И зачем такие сложности в таком языке, который якобы очень прост в изучении? Начинающий программер будет постоянно путаться в операторах, в функциях, в процедурах. Мрак какой то... Видя только кусок кода, такой как: res := Random; разве можно определить, что это, обычное присваивание переменной или вызов функции без параметров?
Два. Оператор program и пустое тело программы. Кстати ";" - это 1 оператор, а ";;" - это 2 оператора. Это азы теории программирования, это должен знать каждый считающий себя программистом. Или например S=Pi*r*r; где Pi - не переменная и не константа, а то что компилируется в инструкцию fldpi. Надо знать встроенные функции своего языка, помнить какие функции присутствуют в текущем модуле, а какие функции берутся из модулей используемых текущим модулем. Тогда путаницы не будет.
CrystalIC каков вопрос, такая и тема. интересно, много ли людей спрашивает "с чего начать изучение линейной алгебры"?
Думаю ему стоит учить по типу как я: ставишь себе вопрос и пытаешся реализовать, например решил написать чтото, начинаешь писать, возникают вопросы, на которые ищешь ответы. Постепенно вопросов станем мало, это и будет 'знание языка'.
Должен и баста. Вот должен и всё тут. А вот С и функцию и процедуру определяет как функцию. Это как-то не того, да? Ну, да, раз там нет понятия процедуры... Нет-нет-нет, даже слушать не будем за такой язык! Я уже говорил, я постоянно путался в Pascal, только не знаю, во имя чего. А в С не путаюсь. Там просто всё. Хотя уже по второму кругу я пошёл.