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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

К тому же наличие дополнительных скобок, как правило, говорит о том, что программист хочет изменить стандартный порядок вычисления, и если смены порядка на самом деле не обнаруживается, то это сбивает с толку того, кто читает потом код.
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. И вспоминать не надо, когда у тебя таблица приоритетов перед глазами, иначе же даже то, что знаешь, надо вспоминать, так как знания валяются именно в памяти. Просто приоритеты арифметических операций вспоминаются столь же быстро, как читаются скобки. А на то, чтоб вспомнить, имеет ли на таком то языке логика приоритет над отношением или наоборот может уходить и пара минут, за это время можно успеть прочитать несколько выражений. Это если вообще вспомнишь.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

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

Ты слишком простой случай рассмотрел. Вот пример:

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

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

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

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

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

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

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

Вот именно так я споткнулся, когда посмотрел на твой код. Конечно, я быстро разобрался что к чему, но если приходится читать большие листинги, то время каждого такого "спотыкания" будет складываться и выльется в приличную общую задержку.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Вы, видимо, пишете миллионы строк ежечасно? Но это значения то не имеет. Сколько раз в год встречается именно модуль и именно длинные логические выражения? У меня менее десяти. Но это не значит, что я вообще пишу мало, просто это не частые части языка. Эйси. Языки высокого уровня - дикость, а ООП - квадратная дикость. И что Вы с такими взглядами делаете в этом разделе? Идите в раздел писанины прямо в опкодах. Ах нет его? Ну создайте форум мастодонтов, где такой раздел не просто будет, а будет единственным профильным, а кроме него будет только курилка.
Вот этого выпада я вообще не понял. При чём тут вообще опкоды? Слово мастодонт я применил в смысле того, что я много держу в голове, не лазя по каждой мелочи в справочник, а не потому, что отвергаю языки высокого уровня или ООП. Я как раз наоборот всецело за ООП и за правильную архитектуру приложения. Я думал, что ты это усвоил по соседним темам.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):А вот пример трудночитаемого варианта того же самого условия:

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

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

Не вижу дальнейшего смысла спора. Мы разговариваем не только на разных языках, но и пишем, походу, на разных, хоть и используем один и тот же компилятор. Будь со своей правдой и дальше. Отныне даже советовать тебе ничего не буду :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить