В моем коде у меня есть
while (++num1begin >= 0 && isdigit(eq[num1begin]))
который должен увеличивать num1begin, проверьте, нет ли num1begin, больше или равно нулю, и проверьте это другое условие.
Это плохая практика кодирования? (И действительно ли это то, что я описал выше?)
Все, что имеет побочные эффекты в ваших условиях, следует избегать, потому что это заставляет человека, читающего этот код, проверить достоверность несколько раз.
Другими словами, он очень подвержен ошибкам и его трудно отлаживать. Если вы увеличиваете свою переменную до или внутри своего, if
или в while
, она будет работать одинаково, но ее гораздо легче понять.
while (++num1begin> = 0 && isdigit (eq [num1begin]))
Все личные предпочтения - в этом ИМХО нет ничего плохого. Лично мне нравится конспектирование - и получить дополнительную строку контекста на экране - больше, чем ++num1begin
на линии раньше....
Для меня я инстинктивно хочу проверить ++num1begin >= 0
которая требует немного умственного усилия, но должна быть выполнена, будет ли инкремент в той же строке или на линии раньше. Порядок оценки и безопасности с использованием с другой стороны &&
требует никаких размышлений/усилий, но это зависит от читателя. Вы всегда должны думать о своей "аудитории", хотя... если другие программисты являются профессиональными C++ разработчиками, они должны быть очень довольны этим. Если это не так, и, возможно, придется остановиться и задаться вопросом об оценке короткого замыкания и точках последовательности, тогда вам может понадобиться разделить его. Опускание на самый низкий общий знаменатель поддерживающего код не всегда лучше... люди должны изучать язык... но разные кодовые базы, естественно, встречаются разными группами людей.
"Я инстинктивно хочу проверить..." - num1begin
используется для индексации в eq
, что isdigit()
подразумевает массив символов, поэтому мои проблемы с этим кодом включают:
num1begin
подписанным типом (поэтому первое условие может когда-либо быть ложным),num1begin
из -1
не является фактическим дозорным значением, которое код пытается избежать поиска (учитывая, что часовые -1 и тип наиболее отрицательного значения являются общими),num1begin >= 0
проверяется на каждой итерации цикла, но, по-видимому, только в первый раз,eq
....Возможно, что исправление для любого из вышеперечисленных может потребовать отказа от текущего кода, но если код функционально корректен и эффективен, то это штраф мной.