Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Религиозные войны > Писали ли Вы хотя бы раз по ошибке if (a=b) ... ?


Автор: kemiisto 8.6.2009, 15:46
Ну, короче, сразу в холиварах! smile 

Утекло http://forum.vingrad.ru/forum/topic-251972.html. Конкретно http://forum.vingrad.ru/index.php?showtopic=251972&view=findpost&p=1890895, отвечающих "Да", ласково проименовали дятлами. smile 

P.S. Сам - дятел. smile 

Автор: LSD 8.6.2009, 15:50
А что такое сишные языки?

Автор: kemiisto 8.6.2009, 15:53
Цитата(LSD @  8.6.2009,  13:50 Найти цитируемый пост)
А что такое сишные языки? 

Ну я хотел было написать C-style based syntax languages. Но чёт сложно больно. Короче, языки, унаследовавшие синтаксические "нюансы" C.

Добавлено @ 15:54
Цитата
Нет, не было.  [ 1 ]   [33.33%]

Так, ну эт был наш безошибочный NightmareZ. smile 

Автор: NightmareZ 8.6.2009, 15:56
Давайте, например, вместо "+" писать "plus". А то какой-нить бедный несчастный ребёнок ошибётся.
Сделаем UberPascal:
Код

function Summ(A, B: Integer): Integer
begin
  Please Set Result as A plus B;
  And Return Result as Function Value;
end;

Автор: kemiisto 8.6.2009, 16:04
NightmareZ, я тоже тебя минусую! smile 

Автор: Любитель 8.6.2009, 16:35
Было. Пару раз. Но это никак не повод менять что-то в синтаксисе.

Автор: JackYF 8.6.2009, 16:50
Цитата(Любитель @  8.6.2009,  15:35 Найти цитируемый пост)
Было. Пару раз. Но это никак не повод менять что-то в синтаксисе. 

ППКС.

Автор: GoodBoy 8.6.2009, 19:12
бывало....

Автор: mr.Anderson 8.6.2009, 19:29
Было, куда без этого. Теперь в случае выдачи ненормальных результатов прогой первым делом проверяю ифы, ибо потом забудешь и убьешь бешеное количество времени на поиск ошибок. Хотя отладка спасает все же в таких случаях всегда)

Автор: source777 8.6.2009, 19:45
Цитата

Писали ли Вы хотя бы раз по ошибке if (a=b) ... ?
"Нет" на такой вопрос может ответить только тот, кто кроме сишного синтаксиса никаких других и не знает, да и то далеко не каждый.  Так что опрос, имхо, бессмысленный. Особенно если учесть, что if (a=b) - это один из самых распространённых багов сишных программ, наряду с проваливающимися case-statement и арифметикой указателей. Настолько распространённый, что C# такой код даже не компилирует и правильно делает.

Добавлено через 1 минуту и 6 секунд
Цитата(Любитель @  8.6.2009,  16:35 Найти цитируемый пост)
Но это никак не повод менять что-то в синтаксисе. 
ну так об этом речь и не идёт...

Автор: Vasay 8.6.2009, 20:11
Цитата(source777 @  8.6.2009,  19:45 Найти цитируемый пост)
Настолько распространённый, что C# такой код даже не компилирует и правильно делает.


А аналог такого кода скомпилит:

Код

                boolean a = true;
                boolean b = false;
                
                if(a=b)
                {
                    ....
                }


Java этот код скомпилит, но если a и b будут чем угодно, кроме boolean, то не скомпилит, так как if требует, что бы результирующее выражение в скобках было boolean.

п.с. по САБЖу - бывало smile 

Автор: Void 8.6.2009, 20:17
На мой взгляд, проблема не столько в выборе символов для операторов присваивания и сравнения, сколько в том, что в Си assignment statement является expression (пишу по-английски, чтобы не было вопросов, под «оператором» подразумевается operator или statement).
Ради сомнительной возможности писать цепочки присваиваний вида
Код
a = b = c;

(чего, кстати, в Python добились, не превращая присваивание в выражение) и экономить одну строчку на условиях или циклах вида
Код
if ((fd = open(...)) > 0) { /* ... */ }

ввели новый класс ошибок.
Хотя опасность проблемы часто преувеличивают. Багов, связанных с указателями и управлением памятью, намного больше.

Автор: kemiisto 8.6.2009, 21:08
Цитата(Void @  8.6.2009,  18:17 Найти цитируемый пост)
На мой взгляд, проблема не столько в выборе символов для операторов присваивания и сравнения, сколько в том, что в Си assignment statement является expression (пишу по-английски, чтобы не было вопросов, под «оператором» подразумевается operator или statement).

 smile 
Цитата(ДогадайсяКто)
Уродство конструкции обычно проявляется в комбинации с другими средствами языка.

Автор: Фантом 8.6.2009, 21:40
В принципе, это стандартное свойство C-подобных языков - компактность исходника превыше всего, в том числе читаемости и "ошибкоемкости". К сожалению, начинающие программисты обычно это любят, а понимание сложностей разработки и поддержки кода на таком языке приходит (если вообще приходит) намного позже, отсюда и популярность этих языков.

Автор: nickless 8.6.2009, 22:32
Бывало. Но с нормальными компиляторами такие баги живут обычно до первой компиляции.

Автор: Severyanin 9.6.2009, 10:22
у меня жили дольше. долго ловил поначалу)))

Автор: bilbobagginz 9.6.2009, 15:03
меня в "школе" учили:
  • если сравниваем переменные с константами, то константу пишем ВСЕГДА слева: Если по ошибке забываем второй знак равенства, программа не компилируется.
  • избегать сравнения переменных в if-ax, использовать макро:
    у каждогоо типа своя сравнилка
    • при дебаге в глаза бросается сравнение IS_SHAPE_EQUAL(color1,color2)
    • при проблеме в макро легче отловить одинаковый баг в макро, чем 1 единственное сравнение в одном из if-ов
    • в принципе это почти объектно ориентированный подход...


Автор: Nastya 9.6.2009, 16:55
nickless, угу. внимательно стоит читать предупреждения компилятора. Хотя я ответила "Да" но для меня это не становилось проблемой. 

Автор: Любитель 9.6.2009, 17:15
Цитата(bilbobagginz @  9.6.2009,  15:03 Найти цитируемый пост)
# если сравниваем переменные с константами, то константу пишем ВСЕГДА слева: Если по ошибке забываем второй знак равенства, программа не компилируется.
# избегать сравнения переменных в if-ax, использовать макро:
у каждогоо типа своя сравнилка

    * при дебаге в глаза бросается сравнение IS_SHAPE_EQUAL(color1,color2)
    * при проблеме в макро легче отловить одинаковый баг в макро, чем 1 единственное сравнение в одном из if-ов
    * в принципе это почти объектно ориентированный подход...

Абсолютно не поддерживаю такой подход smile

Автор: UniBomb 10.6.2009, 17:33
Было пару раз. Но ничего криминального при этом не происходило, т.к. такого рода ошибки я почему то быстро отлавливаю. 

Автор: bems 11.6.2009, 18:41
Не было никогда. Не пишу на сабжевых языках.

Автор: zloyGamer 13.6.2009, 17:19
было несколько раз.., и всегда почемуто их долго искал..
обычно после всяких фокспро и бэйсиков на которых иногда (против своей воли smile по долгу службы ) приходилось писать всякую ерунду,

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

но эт так крик души smile и  smile 

Автор: Прибой94 30.6.2009, 06:15
было 2 раза.


Любитель
 smile Согласен только с константой слева

Автор: Logo 30.6.2009, 11:46
Раньше бывало, сейчас уже отучил себя вроде. Наоборот, случалось в MySql писать == smile О чем он сразу сообщал.

Автор: bilbobagginz 2.7.2009, 17:53
Цитата(Любитель @  9.6.2009,  17:15 Найти цитируемый пост)
Абсолютно не поддерживаю такой подход

ок.
ткни мной в альтернативу, пожалста.

Автор: Любитель 2.7.2009, 18:50
Альтернатива - писать обычные сравнения. Мест, где можно ошибиться всегда полно (x с y перепутать там..) - это не повод изменять синтаксис. Лично я, когда встречаю код с "обратным" сравнением - всегда мысленно ругаюсь.. Уж не знаю почему - всопринимается/читается такой код хуже.. Конечно, дело вкуса, но, думаю многие со мной согласятся.

Автор: bilbobagginz 2.7.2009, 19:02
Цитата(Любитель @  2.7.2009,  18:50 Найти цитируемый пост)
Альтернатива - писать обычные сравнения

понятно. 
на полном серьёзе хотел увидеть какое-то объективное преимущество.
но если единственное что приходит на ум это "дело вкуса", то я остаюсь со своими тараканами smile

Автор: Любитель 2.7.2009, 21:24
Для меня (!) преимущество в том, что подобный код (сравнения с константой слева, макросы и пр.) я буду читать дольше. "Одним взглядом" оценить точно не смогу..

Автор: source777 2.7.2009, 22:15
Цитата(Любитель @  2.7.2009,  21:24 Найти цитируемый пост)
Для меня (!) преимущество в том, что подобный код (сравнения с константой слева, макросы и пр.) я буду читать дольше. "Одним взглядом" оценить точно не смогу.. 

Неудивительно, подобные выверты нарушают семантику кода. Само утверждение "если константа равна чему-то" абсурдно, константа равна только сама себе, на то она и константа и никаких "если" быть по определению не может. 
Что касается макросов аля IS_SHAPE_EQUAL, то они затрудняют чтение кода а их названия являются мусором с семантической точки зрения. Да, часто имеет смысл в if вызывать функцию, но название этой функция должно показывать смысл условного выражения, простейший пример: is_odd(x) вместо тупого IS_INTEGER_EQUAL(x%2, 1) или ужасного 1==x%2.
Так что рекомендации:
Цитата(bilbobagginz @  9.6.2009,  15:03 Найти цитируемый пост)
если сравниваем переменные с константами, то константу пишем ВСЕГДА слева

Цитата(bilbobagginz @  9.6.2009,  15:03 Найти цитируемый пост)
избегать сравнения переменных в if-ax, использовать макро

срочно в топку!!! А всех, кто безжалостно по отношению к коллегам применял данные рекомендации, лишить премии за антигуманное поведение!  smile 

Автор: kemiisto 31.7.2009, 19:26
Вечер добрый!

Долго ли, коротко ли, дошли у меня руки до книжки по ++. Купил по совету людей добрых Х. М. Дейтел, П. Дж. Дейтел
Как программировать на C++, 5-е издание. Объём книги 1500 страниц. Ну а что? "Шок - это по-нашему!" 

Так вот, там есть целый раздел: 5.9. Случайная подмена операции равенства (==) присваиванием (=). Начинается раздел какбэ с обращения к NightmareZ'у:
Цитата
Есть одна ошибка, которую программирующие на С++, вне зависимости от их квалификации, делают так часто, что мы решили отвести ей специальный раздел.

 smile Молодцы парни! smile 
Ну там дальше тыры-пыры, про особенности С++, которые ухудшают положение дел, ... А дальше совет по предотвращению ошибки: 
Цитата
Воспользуйтесь текстовым редактором для поиска всех вхождений знака = в коде...


И так большая часть книжки - сначала авторы расскажут про очередную приплюснутую чушь, потом гениальный совет (обычно из серии "Семь бед - один ответ", типа прислушивайтесь к сообщению компилятора, будьте внимательны, ...) smile Оборжака, короче.

Но! Это ещё не всё комрады. Во введении авторы жгут по полной:
Цитата
C++ является мощным языком программирования, который подойдёт как техническим специалистам, либо не имеющим вообще, либо имеющим небольшой опыт программирования, так и опытным программистам...


Теперь, усядьтесь-ка поудобнее, вспомните Михал Николаича Задорнова... Вспомнили? Наберите воздуха в грудь... Уф... Эпиграф к предисловию книги:
Цитата
Главным достоинством языка является ясность...
 

Я плачу...  smile 

Автор: nerezus 1.8.2009, 21:55
Было конечно, но сразу же находилось.
А вот в питоне этого нету, и я аж от злости поносом изошелся, когда искал варианты, как это можно похакать. Не нашел =\

Автор: Fin 1.8.2009, 23:00
Не помню у кого. Но в статье была рекомендация. Заместо
Код

if (a == 2) {}

Писать
Код

if (2 == a) {}

Тогда уже на стадии компиляции будут отлавливаться такие ошибки. Хотя я каюсь smile. Такую технику преминяю крайне редко. Мне все таки более привычен 1 способ. Привычки менять тяжело.

Автор: GoldFinch 3.8.2009, 19:16
писал, и довольно часто
и отлавливалось это иногда довольно сложно
согласен, что надо писать if(CONST==var) потому что от этого повышается ошибкоустойчивость кода

то что оно "плохо читается"  - это субъективный аргумент.
аргумент из разряда "код С++ неудобно читать". кому то  и классы плохо читаются. 
а вот то что вероятность появления такой ошибки значительно уменьшается - это объективный факт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)