Re[12]: Детские ошибки
От: Аноним  
Дата: 02.06.06 16:11
Оценка: 3 (1)
ZS>
ZS>  it.Increment();
ZS>

много букфф
Re[18]: понимание сути вопроса
От: kan_izh Великобритания  
Дата: 02.06.06 17:42
Оценка:
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
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Детские ошибки
От: Physician Россия  
Дата: 02.06.06 21:14
Оценка:
Здравствуйте, asdfghjkl, Вы писали:

A>Вот за это я и не люблю паскакаль, что приходится писать

A>
A>yyval[yypv[p3+p4] + yypv[p1+p2]] = yyval[yypv[p3+p4] + yypv[p1+p2]] + 2;
A>


Это только любители cиcи++ думают, что на паскакале приходится писать так... они всегда такие путаники...
На самом деле, на паскале это пишется примерно так:

inc(yyval[yypv[p3+p4] + yypv[p1+p2]], 2);
Меняю скатерть-самобранку на аналогичную простынь
Re[4]: Детские ошибки
От: Сергей  
Дата: 02.06.06 21:26
Оценка:
Здравствуйте, Physician, Вы писали:

P>На самом деле, на паскале это пишется примерно так:


P>
P>inc(yyval[yypv[p3+p4] + yypv[p1+p2]], 2);
P>


...но только если тип yyval[] целый. А бывает и float, и ff += 2 в С сработает, а в паскале inc(ff, 2) — нет.
Re[8]: Детские ошибки
От: Physician Россия  
Дата: 02.06.06 22:16
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>Здравствуйте, CreatorCray, Вы писали:


CC>>Здравствуйте, ZevS, Вы писали:


ZS>>>В точку. Именно поэтому использование операторов -- ++ есть зло. В любом примере. Вообще, ввод их в язык считаю ходом довольно неудачным.

CC>>"Вы не любите кошек? Это потому, что вы не умеете их готовить!" (С) не помню чей

CC>>Может не стоит так категорически объявлять злом то, с чем надо уметь обращаться?

CC>>И перестать обвинять язык в кривости написанного кода.

ZS>1. Результат выполнения программы должен быть предсказуем и не зависить он компилятора. Это мое стойкое убеждение.

ZS>2. Языки программирования создают для людей, а не для компьютеров. Следоватьельно код должен быть легко читаем, и это — прерогатива языка. Очень тяжело разгребать чей то кривой код, особенно если он (кривой писатьель) поощряется синтаксисом языка. А как показывает практика, юные программисты очень любят писать код с использованием максимума языковых фенечек.
ZS>3. С++ — отличный язык отлично себя зарекомендовавший, но не надо его возводить в абсолют.

Совершенно правильно.
Я бы ещё добавил, что

4. От современного компилятора требуется не только сделать машинный код из исходного текста, но и максимально помочь программисту сделать минимум ошибок в этом коде, быстро найти имеющиеся ошибки и помочь их исправить. Данные задачи гораздо легче реализуются при создании компилятора с языка, обладающего такими вещами, как строгий контроль типов данных и легкочитаемый, однозначный синтаксис (ведь если человек легко интерпретирует синтаксис — то это легче и запрограммировать). Как побочный эффект, такой код гораздо быстрее компилируется. вы никогда не задумывались, почему компилятор Delphi работает в разы быстрее компиляторов C/C++ и его сообщения об ошибках гораздо более информативны? А почему в новых языках программирования постоянно усиливается контроль типов (в С его не было, в C++ он появился, в C# он стал таким же, как с самого начала был в Паскале)? А зачем появляются такие термины, как "безопасный код", "управляемый код"? Всё-таки, люди (программисты) хотят, чтобы код действительно был как можно более безопасен и управляем, и чтобы среда разработки помогала им делать это, и Microsoft не забывает использовать это в своём маркетинге! Другое дело, что вокруг синтаксиса С и C++ такую функциональность было довольно сложно навернуть, и пришлось всё же создать новый язык (C#)...

Выходит, Вирт хоть и был "теоретик", но он ещё тогда создал ВЕЩЬ, и он уже тогда знал, что людей со временем не удовлетворит утверждение "работающая глупость — это уже не глупость". Ибо глупость может работать сегодня при одних данных и отказаться работать завтра при других. А нужно — чтобы работало ВСЕГДА. И он предложил действенный способ минимизировать количество детских ошибок.
Меняю скатерть-самобранку на аналогичную простынь
Re[5]: Детские ошибки
От: Physician Россия  
Дата: 02.06.06 22:23
Оценка:
Здравствуйте, Сергей, Вы писали:

С>Здравствуйте, Physician, Вы писали:


P>>На самом деле, на паскале это пишется примерно так:


P>>
P>>inc(yyval[yypv[p3+p4] + yypv[p1+p2]], 2);
P>>


С>...но только если тип yyval[] целый. А бывает и float, и ff += 2 в С сработает, а в паскале inc(ff, 2) — нет.


для более универсального случая вполне можно написать:

ff := yyval[yypv[p3+p4] + yypv[p1+p2]];
ff := ff+2;


imho, выглядит вполне нормально...
Меняю скатерть-самобранку на аналогичную простынь
Re[6]: Детские ошибки
От: kan_izh Великобритания  
Дата: 03.06.06 11:25
Оценка:
Physician wrote:

> для более универсального случая вполне можно написать:

>
> ff := yyval[yypv[p3+p4] + yypv[p1+p2]];
> ff := ff+2;
А ff какого типа? Оно изменит значение в массиве yyval?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: Детские ошибки
От: Physician Россия  
Дата: 03.06.06 21:55
Оценка:
Здравствуйте, 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;
Меняю скатерть-самобранку на аналогичную простынь
Re[2]: Детские ошибки
От: Xander Zerge Россия www.zerge.com
Дата: 04.06.06 06:24
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>>Кто видит здесь ошибку без отладчика, поднимите руку.


А>Я, а дальше что ?


Руку.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Серёжа Новиков,
программист
Re[3]: Детские ошибки
От: ansi  
Дата: 05.06.06 03:46
Оценка: 1 (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 = ...
}

Re[7]: Детские ошибки
От: fmiracle  
Дата: 05.06.06 06:41
Оценка:
A>Умникус? Ты сам это разобрал или сначала прочитал все ответы?

Нихренасе. Такой наезд и безо всякого повода... Или у Вас есть основания поладать, что я не умею читать код?

Не понмаю, почему предположеие, что комментарий тоже может быть неправильным выывает такую реакцию. Это я, конечно, в шутку писал, но блин — это такая шутка, которая _регулярно_ повторяется в жизни.

Или Вы никогда не видели неправильных комментариев в коде? А Вы писали большие проекты? А возвращались к ним через год где-то? А чужой код поддерживали? Если да и не видели неверных комментариев — ну вам очень повезло.

Я встречаю время от времени. Кто-то написал код с комментарием, потом код обновил, а коммент — забыл. Кто-то комментил чужой код и неправильно его понял. Кто-то кометировал свой код _после_ написания и перепутал функции — не туда вставил комментарий. Брр.

Не сама частая ошибка, но зато очень хорошо запоминается своей "приятностью"...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Детские ошибки
От: AYuBurtsev  
Дата: 05.06.06 19:39
Оценка:
Здравствуйте, Xander Zerge, Вы писали:

XZ>А код, да. Не для практики, а из серии задач для олимпиад по информатике.


Да, довольно мило... Вот тоже вариантик:

if( expr == !! true )
i += k+++++m;

А на олимпиаде могут переопределить оператор "+=" и предложить поискать ошибку...
Не все на дебаге в хидер смотрят...

С наилучшими пожеланиями.
Re[7]: Детские ошибки
От: the_void Швейцария  
Дата: 05.06.06 20:22
Оценка:
Здравствуйте, AYuBurtsev, Вы писали:

AYB>if( expr == !! true )

AYB> i += k+++++m;

AYB>А на олимпиаде могут переопределить оператор "+=" и предложить поискать ошибку...


Простите, это на каких олимпиадах такими, кхм, извращениями занимаются?
Кстати, += для встроенного типа переопределить не удасться.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Детские ошибки
От: DioNNis http://i-liger.com
Дата: 06.06.06 09:11
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>Здравствуйте, ekamaloff, Вы писали:


E>>Здравствуйте, ZevS, Вы писали:


ZS>>>Вам нравятся эти операторы? И же выведет такой код? И почему?

ZS>>>
ZS>>>    int i = 2;
ZS>>>    i += i--;
ZS>>>    printf("%d", i);
ZS>>>


E>>Тут кажись неопределенное поведение — двойная модификация переменной между точками следования. А вообще за такой код руки надо отрывать а не приводить в качестве примера.


ZS>В точку. Именно поэтому использование операторов -- ++ есть зло. В любом примере. Вообще, ввод их в язык считаю ходом довольно неудачным.


Весьма с вами не согласен!!!!!!! Использование модификаций — очень облегчает понимание, а тем более и написание кода!!!(хотя кто как привык...) НО главно просто не переборщить!!!!!!!!
Владея информацией, владеешь миром. Уинстон Черчилль
Re[7]: Детские ошибки
От: DioNNis http://i-liger.com
Дата: 06.06.06 09:44
Оценка:
Здравствуйте, 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++;

Но надо сказать, что данная процедура работает не корректно (хотя никаких ошибоккомпилятор не выводит (только предупреждения)).
Некорректность заключается в том, что даже в отладчики при остановки программы она просто не прекращает свое выполнение и проходит все выставленные точки.
Владея информацией, владеешь миром. Уинстон Черчилль
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.