Является ли использование i++ (или ++i) действительно хорошей практикой?

Я знаю различия между i ++ и ++ i (как это), если я хочу использовать их новые значения. И я видел много примеров в выражениях использования языка программирования C (K&R), таких как s[i++] = c;, Иногда я сталкиваюсь с кодами (показанными ниже), которые вводят меня в заблуждение, и этот стиль кажется им сильно ухудшенным.

while (*string1++ = *string2++); //in c

И в этом посте Джон избегает использовать этот стиль.

Поэтому мой вопрос заключается в том, чтобы использовать i ++ (или ++ i), как в приведенном выше коде, хорошая практика? Если нет, в какой ситуации я должен использовать его (только когда я не использую его новый клапан?)

2 ответа

Сам по себе i ++ является ясным идиоматическим выражением идеи увеличения переменной. Само по себе это так же ясно, как и получается. Компьютерный язык был назван в честь этой идиомы (C++).

Джон не говорил, чтобы избежать "я ++"; он говорил избегать объединения его с другими выражениями, которые могли бы усложнить ситуацию, где операция приращения была "побочным эффектом". Подобно:

arr2[++j] = arr[++i];   // now what the heck is going on? I have to stop and look.

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

Интересная вещь в операторе ++, кроме того, что это была гениальная идея, заключается в том, что альтернативы префикса и постфикса кодируют больше, чем просто "i = i + 1", они кодируют дополнительную оценку левой или правой части назначение, так сказать. (Или вы можете подумать об этом до / после оценки).

Итак, ++ я функционально:

i = i + 1; return i

и я ++ функционально:

temp = i; i = i + 1; return temp

Это различие вызывает дополнительные "проблемы", скрывая ошибки, и вы можете понять, почему, если компилятор не оптимизирует сгенерированный код, они имеют различные последствия для производительности.

Похоже, что во многом это вопрос личного стиля и требований ситуации.

Проще написать i++ по сравнению с i+=1 или же i=i+1, и это может помочь вам удалить строки кода, которые не передают существенный факт алгоритма.

Конечно, Джон Скит прав (как обычно), что он может сделать ваш код более трудным для понимания: умственное различие между ++i а также i++ это еще один цикл, который должен пройти ваш мозг, чтобы понять, что происходит.

Бывают ситуации, когда вам нужно больше детализации в вашем коде; бывают моменты, когда тебе все равно. На самом деле нет никаких жестких правил.

Конечно, сказав это, я бы лично рекомендовал не использовать i++ или же ++i в качестве аргументов функции (т.е. foo(i++)), поскольку это может привести к появлению очень трудных для отслеживания ошибок, если вы не очень осторожны, или смешать их с другими операторами (например, пример Брайана Чена i++ + k++).

Другие вопросы по тегам