Меня учили циклам в C ++ с использованием общих индексов, таких как i, j, k. Всякий раз, когда индексы имеют значение, например, строки и столбцы в матрице, я всегда давал им описательные имена, такие как row и col. Однако иногда мне просто нужно пройтись по вектору или сделать что-то в цикле for, где индекс действительно является фиктивной переменной.
Я был рад продолжать использовать i, j, k, но недавно мой друг, который работает в софтверной компании, сказал мне в одном из своих обзоров кода, что ему посоветовали против этого, и фактически вместо этого рекомендовал использовать общие индексы форма ii, jj, kk и т. д. Приведенная причина заключалась в том, что эти циклы легче искать в цикле.
Я не знаю каких-либо руководств по стилю, которые касаются этой проблемы, и я не решаюсь переучить себя и преподавать этот стиль студентам, если этот вопрос не был серьезно продуман с разных точек зрения.
Вопрос: Существует ли какой-то консенсус или фактический стиль для родовых индексов в циклах, основанный на этом и других типах практических вопросов?
Стиль именования i
j
k
для индексов цикла восходит, по крайней мере, на время FORTRAN, когда переменные с именами начинаются с I
через N
были неявно считаются, чтобы иметь тип INTEGER
(все остальные переменные считались REAL
).
Хотя идея именовать индексы двойными буквами звучит изящно, трудно представить, почему кому-то придется искать переменную цикла: такие переменные обычно имеют смысл в контексте цикла, который обычно довольно узок. Более того, современные IDE предоставляют функции поиска, управляемые семантикой вашего кода, поэтому поиск по тексту ii
становится гораздо менее важным.
В этом стиле именования нет ничего плохого, если его придерживаются все члены вашей команды. Правда, это относится ко всем рекомендациям по присвоению имен: они получают большую ценность от постоянного использования.
использование ii / jj / kk — больше личного предпочтения вашего коллеги (что ему нужно для поиска индексной переменной).
две вещи на уме
1) держать индексы локальными. Используйте для (int i = 0; …)
2) предпочитайте итератор, когда это возможно.
Имена констант итераций возвращаются из древних языков, таких как «algol» -> i. Они стали традиционными в сегодняшнем программировании. Но вы можете свободно использовать любое наименование, подходящее для того, чтобы люди понимали. Пример:
for(int outer=0; outer< maxVal-1; outer++)
{
for(int inner=outer+1; inner < maxVal; inner++)
{
matrixA[outer][inner]=0; // rowmajor style
}
}
for(int row=0; row< maxVal-1; row++)
{
for(int column=row+1; column < maxVal; column++)
{
matrixA[column][row]=0; // columnmajor style
}
}
Если я не делаю что-то более конкретное (x и y или u и v для графики, строки / столбца в других контекстах и т. Д.), Мне нравится использовать просто c, потому что ввод c ++ заставляет меня хихикать. 🙂