Страница 2 из 2

Re: Как поймать невозможность преобразоваия?

Добавлено: 02 ноя 2015, 10:30
Сионист
К тому же наличие дополнительных скобок, как правило, говорит о том, что программист хочет изменить стандартный порядок вычисления, и если смены порядка на самом деле не обнаруживается, то это сбивает с толку того, кто читает потом код.
2+(3*4). Кому придёт в голову, что порядок операций здесь изменён? (a>b)&&(c<d)||(e!=f). Скобки ни как не влияют на то, будет ли вычислено сначала &&, а потом ||, или наоборот.
. И, кстати, порядок вспоминать не нужно, если ты его и так знаешь.
Ну ка прочитайте a>b and c<d. Хорошо, когда приоритеты */ на всех языках выше приоритетов +-. Но в одних языках отношения имеют приоритет над логикой и a>b and c<d значит (a>b) and (c<d), а в других логика имеет приоритет над отношениями и a>b and c<d значит a>(b and c)<d. И вспоминать не надо, когда у тебя таблица приоритетов перед глазами, иначе же даже то, что знаешь, надо вспоминать, так как знания валяются именно в памяти. Просто приоритеты арифметических операций вспоминаются столь же быстро, как читаются скобки. А на то, чтоб вспомнить, имеет ли на таком то языке логика приоритет над отношением или наоборот может уходить и пара минут, за это время можно успеть прочитать несколько выражений. Это если вообще вспомнишь.

Re: Как поймать невозможность преобразоваия?

Добавлено: 02 ноя 2015, 10:41
Сионист
Понимаешь, если пишешь много кода, то знания как о стандартных функциях, так и о порядке вычисления логических выражений, откладываются сами-собой даже без специальной зубрёжки.
Вы, видимо, пишете миллионы строк ежечасно? Но это значения то не имеет. Сколько раз в год встречается именно модуль и именно длинные логические выражения? У меня менее десяти. Но это не значит, что я вообще пишу мало, просто это не частые части языка.
от второй раз уже напарываюсь на твой аргумент, что вспоминать что-то - это плохо. Прошлый раз ты про называние стандартной функции писал то же самое. Неужели я один такой мастодонт программирования, что для меня подобные аргументы дики и смешны?
Эйси. Языки высокого уровня - дикость, а ООП - квадратная дикость. И что Вы с такими взглядами делаете в этом разделе? Идите в раздел писанины прямо в опкодах. Ах нет его? Ну создайте форум мастодонтов, где такой раздел не просто будет, а будет единственным профильным, а кроме него будет только курилка.

Re: Как поймать невозможность преобразоваия?

Добавлено: 02 ноя 2015, 10:57
Romeo
Ты слишком простой случай рассмотрел. Вот пример:

Код: Выделить всё

!A && (!B || !C)
где A, B, C - любые логические выражения.

Тут скобки нужны в любом случае, так как если убрать скобки, то смысл условия поменяется, ведь у "И" выше приоритет, чем у "ИЛИ", так что без скобок порядок будет таким:

Код: Выделить всё

(!A && !B) || !C
А вот пример трудночитаемого варианта того же самого условия:

Код: Выделить всё

(((!(A)) && (!(B))) || (!(C)))
Замечаешь, как спотыкается взгляд вот в этом месте ")))", когда пытаешься распарсить какой здесь уровень вложенности завершился? А если в предикат будет входить ещё и вызов функции, то там будет четыре скобочки подряд. В глазах вообще рябить начинает.

Вот именно так я споткнулся, когда посмотрел на твой код. Конечно, я быстро разобрался что к чему, но если приходится читать большие листинги, то время каждого такого "спотыкания" будет складываться и выльется в приличную общую задержку.

Re: Как поймать невозможность преобразоваия?

Добавлено: 02 ноя 2015, 11:16
Romeo
Сионист писал(а):Вы, видимо, пишете миллионы строк ежечасно? Но это значения то не имеет. Сколько раз в год встречается именно модуль и именно длинные логические выражения? У меня менее десяти. Но это не значит, что я вообще пишу мало, просто это не частые части языка. Эйси. Языки высокого уровня - дикость, а ООП - квадратная дикость. И что Вы с такими взглядами делаете в этом разделе? Идите в раздел писанины прямо в опкодах. Ах нет его? Ну создайте форум мастодонтов, где такой раздел не просто будет, а будет единственным профильным, а кроме него будет только курилка.
Вот этого выпада я вообще не понял. При чём тут вообще опкоды? Слово мастодонт я применил в смысле того, что я много держу в голове, не лазя по каждой мелочи в справочник, а не потому, что отвергаю языки высокого уровня или ООП. Я как раз наоборот всецело за ООП и за правильную архитектуру приложения. Я думал, что ты это усвоил по соседним темам.

Re: Как поймать невозможность преобразоваия?

Добавлено: 02 ноя 2015, 12:34
Сионист
Romeo писал(а):А вот пример трудночитаемого варианта того же самого условия:

Код: Выделить всё

(((!(A)) && (!(B))) || (!(C)))[/quote][b]Легко[/b] читаемого. В отличие от варианта без скобок, в котором вопрос о том, !A && !B || !C - это (!A)&&(!B)||(!C), или синтаксически ошибочное !(A( && !)B)( (|| !)C)). Причём, если при чтении статьи (только в другой нотации) он ещё решается хотябы за счёт той самой ошибки, то при чтении программы выльется в полчаса поиска таблицы приоритетов (в худшем случае). [quote]Замечаешь, как спотыкается взгляд вот в этом месте ")))", когда пытаешься распарсить какой здесь уровень вложенности завершился? [/quote]На чём там спотыкаться? Чтение любого выражения, содержащего более одной операции, начинается с разбиения его на подвыражения, скобки обрамляют подвыражения. То есть по сути чтение выражения начинается [b]с расстановки в нём скобок на каждый чих[/b]. [quote]Вот этого выпада я вообще не понял. При чём тут вообще опкоды? Слово мастодонт я применил в смысле того, что я много держу в голове, не лазя по каждой [/quote]Вот именно. Для чего придуманы мнемоники? Чтоб не запоминать опкоды. А языки высокого уровня? Чтоб не запоминать мнемоники. А перегрузка функций? Чтоб не запоминать префиксы/суффиксы/... подпрограмм одного назначения. А ООП? Чтоб не запоминать связь нескольких данных в единую сущность и связь этой сущности с подпрограммами, а иметь возможность быстро прочитать их в самом же листинге. Я в состоянии запомнить правила пяти языков сразу, но на вспоминание отдельного правила тратится время и иногда быстрей даже протестировать, чем вспомнить, что имя sqrt на таком то языке не извращено, а действительно означает квадратный корень, или, наоборот, извращено и означает квадрат, а корень зовут sqr, не говоря о префиксах и редких приоритетах. Оперативы на язык не хватает, всё таки не машина, а долговременная работает медленнее, как и у машины (хоть её долговременная и быстрей моей оперативы). Не, если каждый чих распечатывать и каждую строчку искать сутками по распечаткам, тогда оперативы на язык может и хватит. Но в сумме с самой приладой уже нет, а держать там саму приладу эффективней, чем весь язык.

Re: Как поймать невозможность преобразоваия?

Добавлено: 02 ноя 2015, 12:56
Romeo
Не вижу дальнейшего смысла спора. Мы разговариваем не только на разных языках, но и пишем, походу, на разных, хоть и используем один и тот же компилятор. Будь со своей правдой и дальше. Отныне даже советовать тебе ничего не буду :)