Плохая практика кодирования? Предварительное увеличение условия с && [closed]

0

В моем коде у меня есть

while (++num1begin >= 0 && isdigit(eq[num1begin]))

который должен увеличивать num1begin, проверьте, нет ли num1begin, больше или равно нулю, и проверьте это другое условие.

Это плохая практика кодирования? (И действительно ли это то, что я описал выше?)

  • 1
    Какой смысл делать это? Просто увеличьте число внутри цикла while
  • 2
    Зачем писать код, который трудно понять? Настолько, что вы разместите вопрос на этом сайте!
Показать ещё 5 комментариев
Теги:

2 ответа

4

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

Другими словами, он очень подвержен ошибкам и его трудно отлаживать. Если вы увеличиваете свою переменную до или внутри своего, if или в while, она будет работать одинаково, но ее гораздо легче понять.

  • 0
    Я согласен - Жизнь в лучшем случае хитрая, так зачем ее усложнять?
2

while (++num1begin> = 0 && isdigit (eq [num1begin]))

Все личные предпочтения - в этом ИМХО нет ничего плохого. Лично мне нравится конспектирование - и получить дополнительную строку контекста на экране - больше, чем ++num1begin на линии раньше....

Для меня я инстинктивно хочу проверить ++num1begin >= 0 которая требует немного умственного усилия, но должна быть выполнена, будет ли инкремент в той же строке или на линии раньше. Порядок оценки и безопасности с использованием с другой стороны && требует никаких размышлений/усилий, но это зависит от читателя. Вы всегда должны думать о своей "аудитории", хотя... если другие программисты являются профессиональными C++ разработчиками, они должны быть очень довольны этим. Если это не так, и, возможно, придется остановиться и задаться вопросом об оценке короткого замыкания и точках последовательности, тогда вам может понадобиться разделить его. Опускание на самый низкий общий знаменатель поддерживающего код не всегда лучше... люди должны изучать язык... но разные кодовые базы, естественно, встречаются разными группами людей.

"Я инстинктивно хочу проверить..." - num1begin используется для индексации в eq, что isdigit() подразумевает массив символов, поэтому мои проблемы с этим кодом включают:

  • является ли num1begin подписанным типом (поэтому первое условие может когда-либо быть ложным),
  • что num1begin из -1 не является фактическим дозорным значением, которое код пытается избежать поиска (учитывая, что часовые -1 и тип наиболее отрицательного значения являются общими),
  • что num1begin >= 0 проверяется на каждой итерации цикла, но, по-видимому, только в первый раз,
  • что там нет проверки для поиска в конце eq....

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню