Может 'и#39; петли внутри 'и#39; петли использовать то же имя переменной счетчика?

Могу ли я использовать один и тот же счетчик переменной в цикл for В для петли?

Или переменные влияют друг на друга? Если следующий код использовать другую переменную для второго цикла, таких как "J", или " я " нормально?

for(int i = 0; i < 10; i++)
{
  for(int i = 0; i < 10; i++)
  {
  }
}
Комментарии к вопросу (9)
Решение

Вы можете использовать то же имя (идентификатор). Это будет другой объект. Они не влияют друг на друга. Внутри внутреннего цикла, нет никакого способа, чтобы ссылаться на объект, используемый во внешнем цикле (если не принимать специальные меры для этого, предоставляя ссылку на него).

Это вообще плохой стиль, склонен к путанице, и его следует избегать.

Объекты разные, только если внутренний определяется отдельно, как с инт я вам показал. Если же имя используется без определения нового объекта, петель будет использовать один и тот же объект и будут мешать друг другу.

Комментарии (5)

Во-первых, это абсолютно законно: код будет компилироваться и выполняться, повторяя тело вложенного цикла 10×10=100 раз. Счетчик цикла я внутри вложенного цикла будет скрыть счетчик внешнего цикла, так что два счетчика будет увеличиваться независимо друг от друга.

Поскольку наружное " я "скрыто, код внутри вложенного цикла's тело будет иметь доступ только к значению" я "из вложенного цикла, а не" я " от внешнего цикла. В ситуациях, когда вложенный цикл не нужен доступ к внешнему "я", такой код может быть вполне оправданным. Однако, это может создавать большую путаницу в своих читателей, так что's не хорошая идея, чтобы не писать такой код, чтобы избежать "по обслуживанию обязательств.&и"

Примечание: даже если счетчик переменных обе петли имеют тот же идентификатор "я", они остаются двумя независимыми переменными, т. е. вы не использование одной и той же переменной в обоих циклах. С помощью той же переменной в обе петли тоже можно, но код будет трудно читать. Вот пример:

for (int i = 1 ; i < 100 ; i++) {
    for ( ; i % 10 != 0 ; i++) {
        printf("%02d ", i);
    }
    printf("%d\n", i);
}

Теперь обе петли использовать ту же переменную. Однако, это займет некоторое время, чтобы выяснить, что этот код без компиляции (демо);

Комментарии (5)

Вы можете. Но вы должны знать сферу "я". если мы называем внешнее я с 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
}

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

Комментарии (0)

Это вполне возможно, но имейте в виду, что вы не сможете решить первый заявил Я

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);
}
Комментарии (3)

Да, вы можете использовать то же имя переменной счетчика на внутренний цикл 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 области идентификаторов [выделено мной]

....В пределах внутренней области, идентификатор определяет сущность объявляется во внутреннем объеме; лица, объявленные в наружный сфера скрыт (и не видно) в пределах внутренней сферы.

Комментарии (0)

Из кода / точки зрения компилятора это будет вполне действительным и легальным, что нужно сделать. В int я декларированные в Внутренней для(тип int я = 0; я &Л; 10; я++) петля в новый и меньший масштаб, так что декларацию тени декларация о int я во внешнем цикле (или, другими словами, во внутреннем объеме все обращения к переменной i идти к int я, объявленные во внутренней области видимости, оставив int я во внешней области нетронутым).

Тем не менее, с качеством кода точки зрения, это совершенно ужасно. Трудно читать, трудно понять и легко понять. Дон'т сделать это.

Комментарии (0)

Да, безусловно, вы можете использовать то же имя переменной.

Переменные Программирование 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
}

Примечание:это будет лучшая практика, чтобы использовать разные переменные для внутренних и наружных контуров

Комментарии (0)

Да, вы можете использовать его, но это'ы довольно запутанным. Самое главное-это объем локальной переменной внутри цикла. Как далеко, если переменная объявлена внутри функции, сфера применения этой переменной этой функции.

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++){

    }

}
Комментарии (0)

Да - и еще более интересно, что вы можете повторно использовать имя переменной каждый раз, когда вы открываете набор брекетов. Это часто удобно при установке диагностического кода. Тип открытая скобка '{' затем объявление и использование переменных, затем закройте скобки и переменные уйти. Это гарантирует, что вам не будут мешать ни с чем в основном корпусе, сохраняя преимущество переменные, классы и методы, объявленные вне скобок.

Комментарии (0)

Правила: переменная, объявленная в инструкции может быть использован только в этом заявлении и в теле цикла.

Если в коде определено несколько экземпляров я во внутренних циклах каждый экземпляр займет свое собственное пространство памяти. Так что нечего так волноваться о результатах, было бы то же самое.

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;
}

Но не рекомендуется использовать то же имя переменной, так как это трудно понять и это будет не ремонтопригодно в дальнейшем.

Комментарии (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");
 }
}
Комментарии (0)

Ну, вы можете сделать это без скриптов, имеющих проблемы, но вы должны избегать этой структуры. Обычно это приводит к путанице

Комментарии (0)