В чем шутка: if (5==count)?

stm6692945

Много где уже вижу
никак понять не могу

tokuchu

Это не шутка. Чтобы случайно не написать (5 = count).

olega

Чтобы не попутать (count == 5) и (count = 5 ибо (5 = count) — недопустимая конструкция.

Vlad77

Это чтобы не писать -Wparentheses -Werror.

Ivan8209

А если кто-нибудь всё-таки напишет "if (count = 5)", то что?
Как от этого защититься? Средством проверки стиля?
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

evgen5555

Защищаются от проблемы обычно перед ее возникновением, а не после :)

serega1604

А если кто-нибудь всё-таки напишет "if (count = 5)", то что?
Как от этого защититься? Средством проверки стиля?
будет ошибка компиляции, а что?

tokuchu

А если кто-нибудь всё-таки напишет "if (count = 5)", то что?
Как от этого защититься? Средством проверки стиля?
Ну это не ко мне, а к тем кто так пишет. :)
По мне так приучить себя к "==" не сложнее чем к "5 ==".

olega

У меня gcc -Wall выдает такое предупреждение: warning: suggest parentheses around assignment used as truth value [-Wparentheses]. Вот вам и проверка стиля.

Ivan8209

А то, что точно такая же ошибка возникнет при -Wall -Werror.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

Ivan8209

> Ну это не ко мне, а к тем кто так пишет. :)
> По мне так приучить себя к "==" не сложнее чем к "5 ==".
Я всё-таки думаю, что те, кто так пишет, не смогут ответить на такой вопрос.
Я до сих пор не могу понять, что мешает любителям этого стиля заметить ошибку,
написав "if (count = 5)", что не срабатывает при обычном написании "if (count == 5)".
---
"Мы диалектику учили не по Гегелю.
Бряцанием боёв она врывалась в стих..."

zorin29

Почему в треде до сих пор нет картинки?

Ivan8209

Потому что в этом случае правильно писать "count @ 5 = if"
(пренебрежём тем, что "count" уже выполняет другую операцию).
---
"Йоды магистра речи тайна раскрыта..."

Dasar

Средством проверки стиля?
обычно да.
При применении этого стиля таким средством являются глаза: заметить и исправить все count == 5 (и count = 5) на 5 == count много проще, чем заметить и исправить count = 5 на count == 5

Dasar

По мне так приучить себя к "==" не сложнее чем к "5 ==".
Основная проблема не в привычке писать правильно, а в затрудненности выделения опечаток (когда по тем или иным причинам в результате в текстве оказалось count = 5 вместо count == 5 особенно если параллельно работаешь на нескольких языках, в одном из которых сравнение делается через =
ps
как пример плохо выявляемых опечаток из практики: 4 человека минут 10 втыкали почему оно не работает так как хочется, в рамках, конечно значительного куска кода.
long x = 10 * 000 * 000;

Ivan8209

> При применении этого стиля таким средством являются глаза:
> заметить и исправить все count == 5 (и count = 5) на 5 == count много проще,
> чем заметить и исправить count = 5 на count == 5
"Чем грузины," да.
Как часто ты встречал эту ошибку?
Как часто эта ошибка не сопровождалась диагностикой компилятора?
Ничего, что иногда код должен быть именно "count = 5"?
Как твои инструменты отлавливают это?
---
"Университет развивает все способности, в том числе и глупость."

Dasar

Как часто ты встречал эту ошибку?
в чем вешать?
Как часто эта ошибка не сопровождалась диагностикой компилятора?
опять же в каких единицах и при каких условиях измерять?
Полноценная развернутая и настроенная система сборки вылавливает такие опечатки на ура, а какой-нибудь недокомпилятор(а уж тем более интерпретор) для какой-нибудь экзотики - и не такое съест и не подавится.
Ничего, что иногда код должен быть именно "count = 5"?
Во-первых, это означает, что раз такой код понадобился, то автоматический оптимизатор кода совсем плох или вообще отсутствует.
Во-вторых, при необходимости это обходится через комментарий для человека или мета-пометку для анализатора
Как твои инструменты отлавливают это?
выдают предупреждение

zorin29

я тоже считаю, что yoda conditions - это глупость и прошлый век, примерно как венгерская нотация.
Но, если код существует в многоязычной среде и часто правится не-специализированными редакторами, я готов идти на такие уступки.

Ivan8209

> Полноценная развернутая и настроенная система сборки вылавливает
> такие опечатки на ура, а какой-нибудь недокомпилятор
Названия.
> (а уж тем более интерпретор) для какой-нибудь экзотики - и не такое съест и не подавится.
Судя по заголовку, эта экзотика вполне определённого рода.
Кроме того, кому-кому, а вот тебе точно не стоит привлекать сюда "экзотику,"
потому что любой человек, знакомый с "экзотикой" тебе быстро расскажет
про разницу между типами "int" и "int ref".
>> Ничего, что иногда код должен быть именно "count = 5"?
> Во-первых, это означает, что раз такой код понадобился,
> то автоматический оптимизатор кода совсем плох или вообще отсутствует.
Есть такое понятие, "идиома." Так вот, идиома открытия файла в упоминаемых языках
"if fd = open(path, flags != -1)", а не раздельные операторы.
Эта идиома, в частности, подчёркивает, что ошибочная ситуация обработана,
а не отложена на потом.
> Во-вторых, при необходимости это обходится через комментарий
> для человека или мета-пометку для анализатора
Пример кода можешь привести, или это голословное утверждение?
>> Как твои инструменты отлавливают это?
> выдают предупреждение
То есть, они всё равно умеют определять случаи "if (count = 5)",
тогда какого чёрта ты настаиваешь на написании "if (5 == count)"?
Чтобы было?
---
"Университет развивает все способности, в том числе и глупость."

Dasar

тогда какого чёрта ты настаиваешь на написании "if (5 == count)"?
Это утверждение ты домыслил за меня.
Я лишь обозначил при каких условиях это имеет смысл, и ты эти условия не прочитал (либо не понял)

yroslavasako

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

Ivan8209

> а что не так? Общее количество символов сохраняется,
> читаемость сохраняется,
Не сохраняется. Про порядок слов в предложении (разницу между SVO и OVS)
можешь прочитать хоть в википедии.
> при этом избегается одна неприятная ошибка,
Не избегается, так как "count == 5" и "5 == count" полностью эквивалентны.
> которую можно найти и другими способами.
> Но если можно забесплатно сделать не хуже, чем было, то почему нет?
1. Хуже.
2. Небесплатно.
---
"Университет развивает все способности, в том числе и глупость."

Dasar

а что не так?
Конфликтует немного с другими конструкциями: в которых сначала идет основа (Что? а потом вспомогательные данные (С чем?).
В данном случае, переменная является основой (потому что она обычно присутствует в соседних строчках а константа - вспомогательные данные

yroslavasako

Конфликтует немного с другими конструкциями: в которых сначала идет основа (Что? а потом вспомогательные данные (С чем?).
начальный уровень хаскеля кладёт конец всяким предрассудкам о порядке слов в предложении и прочем. Программист обретает навык двунаправленного чтения.
Мне тут могут возразить, что не все этот хаскель видели и пользовались им. Но самая суть проблема (=) и (==) в том, что человек имеет шанс автоматически перенести привычки одного активно используемого языка программирования в другой. А проблема эта как раз актуальна для тех, кто знает много языков

Dasar

Программист обретает навык двунаправленного чтения.
Да, умеет так читать, но это достаточно не оптимальный способ чтения кода.
При эффективном способе код читается последовательно, и стиль написания кода (и языковые конструкции) обязан способствовать использованию этого способа чтения.

Ivan8209

> начальный уровень хаскеля кладёт конец всяким предрассудкам о порядке слов в предложении и прочем.
Твой хаскель только подчёркивает этот порядок: "f x" --- прямой, а "x |> f" --- обратный,
почему и требуется соответствующий оператор.
---
"Тому, кто не доверяет себе, разумнее всего молчать."

yroslavasako

При эффективном способе код читается последовательно,
код читается не последовательно, а в порядке исполнения

serega1604

о, я так и знал что есть люди ничего кроме сишечки не представляющие.

Maurog

Чтобы случайно не написать (5 = count).
много читал про этот "паттерн", но так и не смог на него перестроиться. лично я считаю, что проблемы "if (count = 5)" преувеличены. они так редко встречаются, что переходить на "if (5 == count)" нет смысла. то есть средства не оправдывают цели.

andrei260280

согласен. плюс 5 == count просто выглядит уебищно

6yrop

перенести привычки одного активно используемого языка программирования в другой
а это хорошо что ли? Например, Крыс, скорее всего, на Java, поэтому ему не понятно нахера это извращение.

6yrop

Это пусть и маленький, но всё же пример отрицательного влияния использования нескольких языков. С полноценным переключением между языками голова не справляется, поэтому давайте выдумывать межязыковые стили?

vall

gcc уже сто лет как ругается на if (a=1) и требует if a=1 это значительно более лучше чем 1==a
плюс можно заставить ругаться на тождественно ложные / истинные условия.
false-positive будет огромный, но баги находить помогает.

Serab

настоящий программист на фортране пишет на фортране на любом языке программирования :umnik:

luna89

Например, Крыс, скорее всего, на Java, поэтому ему не понятно нахера это извращение.

В яве похожая идиома есть:
  if (var.equals( "somestr")  )  
- потенциальный NullPointerException
  if ( "somestr".equals(var)  )  
- ok

tata61

никак понять не могу
Очередная нотация о хорошем коде.

apl13

Спойлер-то в подписи зачем?

apl13

Надо писать на сях bash-style:
count == 5 && printf("5 count equal is to.\n");

Тогда от пропущенного "равно" операций порядок оберегает нас. :umnik:

margadon

твой код будет работать как надо, а с опечаткой - всегда печатать "5..."
конечно, это будет верно, но смысл? :)

apl13

Же семантику опечатка изменяет.

margadon

такое ещё сложнее отловить :(

apl13

Ну вот.
Выработает хотя бы привычку ставить правильные знаки.

apl13

Но вообще, конечно, начинающим программистам, испытывающим проблему двух "равно", рекомендую перейти на Схему.
Я, во всяком случае, не уверен, что сходу решусь выпить столько, чтобы перепутать (= count 5) и (set! count 5).

vall

Это превышает человеческие возможности. Какой-то язык для сверхчеловеков

apl13

Для атлантов!

bleyman

Чорная. Её пьёшь и она тебя растворяет и распыляет твоё ДНК по морям и океанам.

akkylla

Уапще хороший плюсер не напишет x=5 вместо x==5, и надо сказать что меня раз в неделю C# ругает на том, что напишу = вместо ==, и за это ему благодарен... в С++ место только увлеченным

apl13

твоё ДНК
В истории еще не было более неуместного употребления буквы "ё".
(Не считая ежедневного "твоё день рожденье", конечно.)

apl13

Еще вариант написать "#define EQ ==".
Позволяет решить нерешаемую методом из заголовка проблему "if(count EQ schmount)".

erotic

Я понял, что для меня это - возможность сразу узнать, будет ли сравнение.
Например, if (длинный-длинный вызов и в конце != 0)
Если так писать, то хз, будет ли там в конце сравнение или if будет на результат функции смотреть. А если написать
if (0 != длинный-длинный-вызов то условие сразу понятно.
Мне удобнее.
Оставить комментарий
Имя или ник:
Комментарий: