ZevS wrote:
>> > Кстати, почитайте статью Вирта в последнем RSDN-е. Интересная статейка. > _>Странная у него там критика. Теоретик он. Не принимает простое правило > "если это глупо, но работает, значит это не глупо".
> В ходе этой /дискуссии/ почему-то получается так что я говорю об > операторах ++ -- , а мне отвечают в том духе что С++ лучше всех. С++ > безусловно круче чем VB, Java, весь .NET, Prolog, Lisp и др. вместе > взятые. Закрыли тему — глупая она.
Да не круче. Просто когда ко всякой херне прикапываются не по делу — смешно становится.
> *По существу, есть у вас что-либо в защиту именно этих операторов?*
Не нравится — не используй. Напиши:
#define pre_increment(i) (++i)
#define post_increment(i) (i++)
// или даже такtemplate<T> T& pre_increment(T& i){return ++i;}
template<T> T post_increment(T& i){return i++;}
// и не забудь добавить:#define BEGIN {
#define END }
и никогда не пиши ++ более.
> зыЖ Я уверен более чем на 90% что если вы загляните в свой собственный > код, то не увидите эти операторы где-либо, кроме как в заголовке цикла for.
А что плохого в том, что это очень удобно применять в for?
Вот ещё, например:
Iter parts = make_split_iterator(str, first_finder("|", is_iequal()));
const string name(copy_range<string>(*parts++));
const string value(copy_range<string>(*parts++));
const string params(copy_range<string>(*parts++));
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, asdfghjkl, Вы писали:
A>Вот за это я и не люблю паскакаль, что приходится писать A>
A>yyval[yypv[p3+p4] + yypv[p1+p2]] = yyval[yypv[p3+p4] + yypv[p1+p2]] + 2;
A>
Это только любители cиcи++ думают, что на паскакале приходится писать так... они всегда такие путаники...
На самом деле, на паскале это пишется примерно так:
Здравствуйте, ZevS, Вы писали:
ZS>Здравствуйте, CreatorCray, Вы писали:
CC>>Здравствуйте, ZevS, Вы писали:
ZS>>>В точку. Именно поэтому использование операторов -- ++ есть зло. В любом примере. Вообще, ввод их в язык считаю ходом довольно неудачным. CC>>"Вы не любите кошек? Это потому, что вы не умеете их готовить!" (С) не помню чей
CC>>Может не стоит так категорически объявлять злом то, с чем надо уметь обращаться? CC>>И перестать обвинять язык в кривости написанного кода.
ZS>1. Результат выполнения программы должен быть предсказуем и не зависить он компилятора. Это мое стойкое убеждение. ZS>2. Языки программирования создают для людей, а не для компьютеров. Следоватьельно код должен быть легко читаем, и это — прерогатива языка. Очень тяжело разгребать чей то кривой код, особенно если он (кривой писатьель) поощряется синтаксисом языка. А как показывает практика, юные программисты очень любят писать код с использованием максимума языковых фенечек. ZS>3. С++ — отличный язык отлично себя зарекомендовавший, но не надо его возводить в абсолют.
Совершенно правильно.
Я бы ещё добавил, что
4. От современного компилятора требуется не только сделать машинный код из исходного текста, но и максимально помочь программисту сделать минимум ошибок в этом коде, быстро найти имеющиеся ошибки и помочь их исправить. Данные задачи гораздо легче реализуются при создании компилятора с языка, обладающего такими вещами, как строгий контроль типов данных и легкочитаемый, однозначный синтаксис (ведь если человек легко интерпретирует синтаксис — то это легче и запрограммировать). Как побочный эффект, такой код гораздо быстрее компилируется. вы никогда не задумывались, почему компилятор Delphi работает в разы быстрее компиляторов C/C++ и его сообщения об ошибках гораздо более информативны? А почему в новых языках программирования постоянно усиливается контроль типов (в С его не было, в C++ он появился, в C# он стал таким же, как с самого начала был в Паскале)? А зачем появляются такие термины, как "безопасный код", "управляемый код"? Всё-таки, люди (программисты) хотят, чтобы код действительно был как можно более безопасен и управляем, и чтобы среда разработки помогала им делать это, и Microsoft не забывает использовать это в своём маркетинге! Другое дело, что вокруг синтаксиса С и C++ такую функциональность было довольно сложно навернуть, и пришлось всё же создать новый язык (C#)...
Выходит, Вирт хоть и был "теоретик", но он ещё тогда создал ВЕЩЬ, и он уже тогда знал, что людей со временем не удовлетворит утверждение "работающая глупость — это уже не глупость". Ибо глупость может работать сегодня при одних данных и отказаться работать завтра при других. А нужно — чтобы работало ВСЕГДА. И он предложил действенный способ минимизировать количество детских ошибок.
Physician wrote:
> для более универсального случая вполне можно написать: > > ff := yyval[yypv[p3+p4] + yypv[p1+p2]]; > ff := ff+2;
А ff какого типа? Оно изменит значение в массиве yyval?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, kan_izh, Вы писали:
_>Physician wrote:
>> для более универсального случая вполне можно написать: >> >> ff := yyval[yypv[p3+p4] + yypv[p1+p2]]; >> ff := ff+2; _>А ff какого типа? Оно изменит значение в массиве yyval?
Сорри, опечатался. Имел в виду вот это:
i := yypv[p3+p4] + yypv[p1+p2];
yyval[i] := yyval[i]+1;
Здравствуйте, ekamaloff, Вы писали:
A>>Насколькоя я знаю, в изначальном C (или B) именно так эти операторы и записывались. Так что, все правильно Компилятор у тебя просто слишком новый
E> А как записывалось присвоение отрицательного значения?
Полагаю, что с пробелом. Вот отрывок из доки к flex:
Функция yyless() в различных обстоятельствах может быть использована для повторной обработки текста. Рассмотрим проблему определения неоднозначного выражения =-a в старом варианте СИ. Допустим, что это требуется представить как =- a для последующей печати. Можно применить следующее правило:
=-[a-zA-Z] {
printf("Operator(=-)ambiguous\n");
yyless(yyleng-1);
... action for =- ...
}
Будет печататься сообщение, после каждого оператора буква будет возвращаться во входной поток, а оператор будет трактоваться как =-.
Наоборот, может потребоваться трактовать это как = -a; чтобы добиться этого, уберите знак минус и букву для ввода. Интерпретация будет выполнена следующими строками:
=-[a-zA-Z {
printf("Operator(=-)ambiguous\n");
yyless(yyleng-2);
... action for = ...
}
A>Умникус? Ты сам это разобрал или сначала прочитал все ответы?
Нихренасе. Такой наезд и безо всякого повода... Или у Вас есть основания поладать, что я не умею читать код?
Не понмаю, почему предположеие, что комментарий тоже может быть неправильным выывает такую реакцию. Это я, конечно, в шутку писал, но блин — это такая шутка, которая _регулярно_ повторяется в жизни.
Или Вы никогда не видели неправильных комментариев в коде? А Вы писали большие проекты? А возвращались к ним через год где-то? А чужой код поддерживали? Если да и не видели неверных комментариев — ну вам очень повезло.
Я встречаю время от времени. Кто-то написал код с комментарием, потом код обновил, а коммент — забыл. Кто-то комментил чужой код и неправильно его понял. Кто-то кометировал свой код _после_ написания и перепутал функции — не туда вставил комментарий. Брр.
Не сама частая ошибка, но зато очень хорошо запоминается своей "приятностью"...
Здравствуйте, AYuBurtsev, Вы писали:
AYB>if( expr == !! true ) AYB> i += k+++++m;
AYB>А на олимпиаде могут переопределить оператор "+=" и предложить поискать ошибку...
Простите, это на каких олимпиадах такими, кхм, извращениями занимаются?
Кстати, += для встроенного типа переопределить не удасться.
Здравствуйте, ZevS, Вы писали:
ZS>Здравствуйте, ekamaloff, Вы писали:
E>>Здравствуйте, ZevS, Вы писали:
ZS>>>Вам нравятся эти операторы? И же выведет такой код? И почему? ZS>>>
ZS>>> int i = 2;
ZS>>> i += i--;
ZS>>> printf("%d", i);
ZS>>>
E>>Тут кажись неопределенное поведение — двойная модификация переменной между точками следования. А вообще за такой код руки надо отрывать а не приводить в качестве примера.
ZS>В точку. Именно поэтому использование операторов -- ++ есть зло. В любом примере. Вообще, ввод их в язык считаю ходом довольно неудачным.
Весьма с вами не согласен!!!!!!! Использование модификаций — очень облегчает понимание, а тем более и написание кода!!!(хотя кто как привык...) НО главно просто не переборщить!!!!!!!!
Здравствуйте, AYuBurtsev, Вы писали:
AYB>Здравствуйте, Xander Zerge, Вы писали:
XZ>>А код, да. Не для практики, а из серии задач для олимпиад по информатике.
AYB>Да, довольно мило... Вот тоже вариантик:
AYB>if( expr == !! true ) AYB> i += k+++++m;
AYB>А на олимпиаде могут переопределить оператор "+=" и предложить поискать ошибку... AYB>Не все на дебаге в хидер смотрят...
AYB>С наилучшими пожеланиями.
Увлекся вашим интереснейшим примерчиком и решил его немного развить (так сказать для полной красоты... )
вот что получилось:
int i=1;
int k=5;
int m = 10;
i +=++k+++++m++;
Но надо сказать, что данная процедура работает не корректно (хотя никаких ошибоккомпилятор не выводит (только предупреждения)).
Некорректность заключается в том, что даже в отладчики при остановки программы она просто не прекращает свое выполнение и проходит все выставленные точки.