Является ли использование 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++
).