Могу ли я использовать ту же переменную счетчика для for
цикла внутри for
цикла?
Или переменные будут влиять друг на друга? Должен ли следующий код использовать другую переменную для второго цикла, например j
, или i
нормально?
for(int i = 0; i < 10; i++)
{
for(int i = 0; i < 10; i++)
{
}
}
i
с разными областями действия. Используйте-Wshadow
с GCC, чтобы автоматически сообщать о таких проблемах.-Wshadow
не входит в-Wall
.-Wshadow
предупреждает о затенении глобальных переменных, что может легко раздражать в больших проектах.-Wextra
не включает-Wshadow
. Я думаю, что это достаточно распространено в некоторых проектах, или какой-то разработчик gcc любит затенение как стиль кодирования, чтобы гарантировать, что его так упускают.-Wshadow
имеет ужасающую частоту ложных срабатываний, что делает его совершенно бесполезным. Масштаб существует не просто так, и затенение априори не проблематично. Теперь-Wshadow-local
(примечание: нет-Wshadow=local
) совсем другое. Но, к сожалению, GCC до сих пор отказывался включать его в транк (хотя, похоже, есть форки GCC, которые его включают).Ответы:
Вы можете использовать то же имя (идентификатор). Это будет другой объект. Они не повлияют друг на друга. Внутри внутреннего цикла нет возможности ссылаться на объект, используемый во внешнем цикле (если вы не сделаете для этого специальные условия, например, указав на него указатель).
Как правило, это плохой стиль, поэтому его следует избегать.
Объекты отличаются только в том случае, если внутренний определяется отдельно, как в случае с
int i
показанным вами. Если то же имя используется без определения нового объекта, циклы будут использовать тот же объект и будут мешать друг другу.источник
Во-первых, это абсолютно законно: код скомпилируется и запустится, повторяя тело вложенного цикла 10 × 10 = 100 раз. Счетчик цикла
i
внутри вложенного цикла скроет счетчик внешнего цикла, поэтому два счетчика будут увеличиваться независимо друг от друга.Поскольку внешний вид
i
скрыт, код внутри тела вложенного цикла будет иметь доступ только к значениюi
вложенного цикла, а неi
из внешнего цикла. В ситуациях, когда вложенному циклу не нужен доступ к внешнему,i
такой код может быть вполне оправдан. Однако это, вероятно, приведет к еще большей путанице у читателей, поэтому рекомендуется избегать написания такого кода, чтобы избежать «обязательств по обслуживанию».Примечание. Несмотря на то, что переменные счетчика обоих циклов имеют один и тот же идентификатор
i
, они остаются двумя независимыми переменными, т.е. вы не используете одну и ту же переменную в обоих циклах. Также возможно использование одной и той же переменной в обоих циклах, но код будет трудно читать. Вот пример:Теперь оба цикла используют одну и ту же переменную. Однако требуется время, чтобы понять, что делает этот код без его компиляции ( демонстрация );
источник
int
внутреннем цикле for, т.е. фактически использовать одну и ту же переменную счетчика, внешний цикл будет выполняться только один раз, так как внутренний цикл уйдетi == 10
. Это тривиально, но я подумал, что он дает разъяснение, учитывая, как был задан вопросТы можешь. Но вы должны знать об объеме
i
s. если мы назовем внешнююi
с помощью,i_1
а внутреннююi
с помощьюi_2
, объемi
s будет следующим:Вы должны заметить, что они не влияют друг на друга, и различаются просто их рамки определения.
источник
Это вполне возможно, но имейте в виду, что вы не сможете обратиться к первому объявленному i
во втором цикле внутри второго дочернего цикла
если вам нужно отрегулировать или получить значение первого i, используйте j во втором цикле
и если у вас достаточно творческих способностей, вы можете сделать и то, и другое за один цикл
источник
Да, вы можете использовать то же имя переменной счетчика для внутреннего
for
цикла, что и для внешнегоfor
цикла.Из цикла :
Объем loop_statement будет вложен в пределах объема init_clause .
Из стандартов C # 6.8.5p5 Операторы итераций [выделено мной]
Из стандартов C # 6.2.1p4 Области действия идентификаторов [выделено мной]
источник
С точки зрения кода / компилятора это было бы вполне допустимо и законно.
int i
Объявлено во внутреннемfor(int i = 0; i < 10; i++)
цикле находится в новом и меньшем объеме, так что заявление тень декларации оint i
во внешнем контуре (или, другими словами: Во внутреннем объеме всех обращения к переменнымi
идти кint i
объявлено во внутреннем объеме, оставивint i
нетронутым во внешнем прицеле).Тем не менее, с точки зрения качества кода это ужасно. Его трудно читать, трудно понять и легко понять неправильно. Не делай этого.
источник
Да, вы можете использовать это, но это довольно запутанно. Самое главное - это область видимости локальной переменной внутри цикла. Если переменная объявлена внутри функции, область видимости этой переменной - это эта функция.
Аналогично случаю с циклами, переменная, объявленная внутри внутреннего цикла, имеет другую область видимости, а объявленная переменная внешнего цикла имеет другую область видимости.
Лучше всего использовать разные переменные для внутреннего и внешнего циклов.
источник
Да, безусловно, вы можете использовать переменную с таким же именем.
Переменные программирования C могут быть объявлены в трех местах:
локальные переменные: -Внутри функции или блока.
Глобальные переменные: -Вне всех функций.
Формальные параметры: -В параметрах функции.
Но в вашем случае
i scope
придется помнить о вещах нижеПримечание. Было бы лучше использовать разные переменные для внутреннего и внешнего циклов.
источник
Да, и что еще более интересно, вы можете повторно использовать имя переменной каждый раз, когда открываете набор фигурных скобок. Это часто бывает удобно при вводе диагностического кода. Введите открывающую скобку '{', затем объявление и использование переменных, затем закройте скобку, и переменные исчезнут. Это гарантирует, что вы не будете мешать чему-либо в основном теле, сохраняя при этом преимущество любых переменных, классов и методов, объявленных вне фигурных скобок.
источник
Правило области действия: переменная, объявленная в операторе for, может использоваться только в этом операторе и теле цикла.
Если в вашем коде вы определили несколько экземпляров i во внутренних циклах, каждый экземпляр будет занимать свое собственное пространство памяти. Так что о результатах беспокоиться нечего, все равно все будет так же.
Но не рекомендуется использовать одно и то же имя переменной, так как это трудно понять, и позже он становится не обслуживаемым кодом.
источник
Важной частью является то, что параметр внутреннего цикла содержит
int i
. Посколькуi
это переопределено таким образом, две переменные не влияют друг на друга; их масштабы разные. Вот два примера, чтобы показать это:Обратите внимание, что приведенный выше код включает
int i
параметр внутреннего цикла, а приведенный ниже код включает толькоi
.источник
Что ж, вы можете сделать это без проблем со скриптами, но вам следует избегать такой структуры. Обычно это приводит к путанице
источник