Могу ли я использовать один и тот же счетчик переменной в цикл for
В для
петли?
Или переменные влияют друг на друга? Если следующий код использовать другую переменную для второго цикла, таких как "J", или " я " нормально?
for(int i = 0; i < 10; i++)
{
for(int i = 0; i < 10; i++)
{
}
}
Вы можете использовать то же имя (идентификатор). Это будет другой объект. Они не влияют друг на друга. Внутри внутреннего цикла, нет никакого способа, чтобы ссылаться на объект, используемый во внешнем цикле (если не принимать специальные меры для этого, предоставляя ссылку на него).
Это вообще плохой стиль, склонен к путанице, и его следует избегать.
Объекты разные, только если внутренний определяется отдельно, как с инт я вам показал. Если же имя используется без определения нового объекта, петель будет использовать один и тот же объект и будут мешать друг другу.
Во-первых, это абсолютно законно: код будет компилироваться и выполняться, повторяя тело вложенного цикла 10×10=100 раз. Счетчик цикла я
внутри вложенного цикла будет скрыть счетчик внешнего цикла, так что два счетчика будет увеличиваться независимо друг от друга.
Поскольку наружное " я "скрыто, код внутри вложенного цикла's тело будет иметь доступ только к значению" я "из вложенного цикла, а не" я " от внешнего цикла. В ситуациях, когда вложенный цикл не нужен доступ к внешнему "я", такой код может быть вполне оправданным. Однако, это может создавать большую путаницу в своих читателей, так что's не хорошая идея, чтобы не писать такой код, чтобы избежать "по обслуживанию обязательств.&и"
Примечание: даже если счетчик переменных обе петли имеют тот же идентификатор "я", они остаются двумя независимыми переменными, т. е. вы не использование одной и той же переменной в обоих циклах. С помощью той же переменной в обе петли тоже можно, но код будет трудно читать. Вот пример:
for (int i = 1 ; i < 100 ; i++) {
for ( ; i % 10 != 0 ; i++) {
printf("%02d ", i);
}
printf("%d\n", i);
}
Теперь обе петли использовать ту же переменную. Однако, это займет некоторое время, чтобы выяснить, что этот код без компиляции (демо);
Вы можете. Но вы должны знать сферу "я". если мы называем внешнее я
с i_1
и внутреннего я
с i_2
сфера `Я ' выглядит следующим образом:
for(int i = 0; i < 10; i++)
{
// i means i_1
for(int i = 0; i < 10; i++)
{
// i means i_2
}
// i means i_1
}
Вы должны заметить, что они не влияют друг на друга, и только их области определения разные.
Это вполне возможно, но имейте в виду, что вы не сможете решить первый заявил Я
for(int i = 0; i < 10; i++)//I MEAN THE ONE HERE
{
for(int i = 0; i < 10; i++)
{
}
}
во второй цикл второй цикл ребенка
for(int i = 0; i < 10; i++)
{
for(int i = 0; i < 10; i++)//the new i
{
// i cant see the i thats before this new i here
}
}
если вам нужно настроить или получить значение из первых, используйте J во втором контуре
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
}
}
а если ваши творческие достаточно, вы можете сделать их обоих в одной петле
for(int i ,j= 0; i < 10; (j>9) ? (i++,j=0) : 0 ,j++)
{
printf("%d %d\n",i,j);
}
Да, вы можете использовать то же имя переменной счетчика на внутренний цикл for
внешний для
петли.
От цикл for:
для ( init_clause ; cond_expression ; iteration_expression ) loop_statement` Оператор выражение, используемое в качестве loop_statement устанавливает свои объем блока, в отличие от объема от init_clause.
для (int я = 0; ; ) { долго я = 1; // действует с, недопустимо в C++ // ... }
Область применения loop_statement составляет вложенные в пределах init_clause.
Из Стандартов C#6.8.5p5 итераторы [выделено мной]
оператора цикла-это блок, чья сфера деятельности является строгим подмножеством объема блока включения. Тело цикла-это тоже блоки, чья сфера деятельности является строгим подмножеством объема итерации заявление.
Из Стандартов C#6.2.1p4 области идентификаторов [выделено мной]
....В пределах внутренней области, идентификатор определяет сущность объявляется во внутреннем объеме; лица, объявленные в наружный сфера скрыт (и не видно) в пределах внутренней сферы.
Из кода / точки зрения компилятора это будет вполне действительным и легальным, что нужно сделать. В int я декларированные в Внутренней для(тип int я = 0; я &Л; 10; я++)
петля в новый и меньший масштаб, так что декларацию тени декларация о int я
во внешнем цикле (или, другими словами, во внутреннем объеме все обращения к переменной i
идти к int я
, объявленные во внутренней области видимости, оставив int я
во внешней области нетронутым).
Тем не менее, с качеством кода точки зрения, это совершенно ужасно. Трудно читать, трудно понять и легко понять. Дон'т сделать это.
Да, безусловно, вы можете использовать то же имя переменной.
Переменные Программирование C может быть объявлено в трех местах: локальные переменные:-внутри функции или блока. Глобальные переменные:-из всех функций. Формальные параметры:-в параметры функции.
Но в вашем случае я рамки должны учитывать следующие вещи
for(int i = 0; i < 10; i++)
{
// i means 1st for loop variable
for(int i = 0; i < 10; i++)
{
// but here i means 2nd for loop variable
}
//interesting thing here i means 1st for loop variable
}
Примечание:это будет лучшая практика, чтобы использовать разные переменные для внутренних и наружных контуров
Да, вы можете использовать его, но это'ы довольно запутанным. Самое главное-это объем локальной переменной внутри цикла. Как далеко, если переменная объявлена внутри функции, сфера применения этой переменной этой функции.
int a = 5;
// scope of a that has value 5
int func(){
int a = 10;
// scope of a that has value 10
}
// scope of a that has value 5
Точно так же обстоит дело с петлями, переменная, объявленная внутри внутреннего цикла имеют разный объем и переменная, объявленная вне цикла имеет разные масштабы.
for(int i = 0; i < 10; i++){
// In first iteration, value of i is 0
for(int i = 1; i < 10; i++){
// In first iteration, value of i is 1
}
// In first iteration, value of i is 0
}
Лучшим подходом является использование различных переменных для внутренней и внешней петли.
for(int i = 0; i < 10; i++){
for(int j = 1; j < 10; j++){
}
}
Да - и еще более интересно, что вы можете повторно использовать имя переменной каждый раз, когда вы открываете набор брекетов. Это часто удобно при установке диагностического кода. Тип открытая скобка '{' затем объявление и использование переменных, затем закройте скобки и переменные уйти. Это гарантирует, что вам не будут мешать ни с чем в основном корпусе, сохраняя преимущество переменные, классы и методы, объявленные вне скобок.
Правила: переменная, объявленная в инструкции может быть использован только в этом заявлении и в теле цикла.
Если в коде определено несколько экземпляров я во внутренних циклах каждый экземпляр займет свое собственное пространство памяти. Так что нечего так волноваться о результатах, было бы то же самое.
int main(void) {
int i = 2; //defined with file global scope outside of a function and will remain 2
if(1)
{ //new scope, variables created here with same name are different
int i = 5;//will remain == 5
for(int i = 0; i < 10; i++)
{ //new scope for "i"
printf("i value in first loop: %d \n", i); // Will print 0 in first iteration
for(int i = 8; i < 15; i++)
{ //new scope again for "i", variable with same name is not the same
printf("i value in nested loop: %d \n", i); // Will print 8 in first iteration
}
}
}
return 0;
}
Но не рекомендуется использовать то же имя переменной, так как это трудно понять и это будет не ремонтопригодно в дальнейшем.
Важной частью является то, что внутренний параметр loop содержит инт я
. Потому что я
переопределяется таким образом, эти две переменные не влияют друг на друга; их объемы разные. Вот два примера, чтобы показать это:
for(int i = 0; i < 10; i++) // This code will print "Test" 100 times
{
for(int i = 0; i < 10; i++)
{
puts("Test");
}
}
Обратите внимание, что в приведенном выше коде типа int i
в внутренний параметр Loop, и код ниже только включает в себя "я".
for(int i = 0; i < 10; i++) // This code will print "Test" 10 times
{
for(i = 0; i < 10; i++)
{
puts("Test");
}
}