Почему эта программа на C выводит «10» независимо от цикла for? - PullRequest
1 голос
/ 01 июля 2019
#include <stdio.h>
int main()
{
  int i=10;
  for (int i=1;i<=20;i++)
    i++;
    printf("%d",i); 
  return 0;
}

Я не понимаю, почему эта программа на C всегда печатает вывод только как 10, независимо от условия, заданного в цикле for. Я попытался выполнить его, внеся некоторые изменения в цикл for, например for (int i=1;i<=50;i++), но он вернул тот же результат! В чем здесь ошибка?

Ответы [ 6 ]

6 голосов
/ 01 июля 2019

Это то, что говорит ваш код на самом деле , с некоторыми комментариями для иллюстрации

#include <stdio.h>
int main()
{
    int i=10;               // Variable i is declared (=10)
    for (int i=1;i<=20;i++) // DIFFERENT variable i is declared, hiding the first variable (=1).
    {
        i++;                // The inner-i variable increments: 3, 5, 7, .... 19
    }                       // inner-i is complete, and disappears.  It is no longer active.

    printf("%d",i);         // The original Variable i is printed.
                            // It still has value 10, as originally initialized.
    return 0;
}
5 голосов
/ 01 июля 2019

Это цикл for, поэтому он увеличивается в соответствии с тем, что вы пишете в его заголовке: i++ здесь.Вам не нужно увеличивать i вручную в теле цикла, выполнив i++ еще раз.

Более того, если вы объявите переменную i перед циклом и напишите for (int i=1;i<=20;i++), он объявляет другую переменную только для области видимости цикла.Поскольку вы не ставили никаких скобок вокруг кода цикла, последний состоит только из строки i++.Затем область действия for заканчивается, и вы печатаете «другую» переменную i, которую вы объявили ранее и инициализировали в 10.

4 голосов
/ 01 июля 2019

В C отступ не является частью блочной структуры (как в Python).

Это означает, что ваш код действительно выглядит примерно так:

#include <stdio.h>
int main()
{
  int i=10;
  for (int i=1;i<=20;i++)
    i++;  // In loop

  printf("%d",i);  // Not in loop
  return 0;
}

Блоки кодадолжны быть разделены фигурными скобками { и }:

#include <stdio.h>
int main()
{
  int i=10;
  for (int i=1;i<=20;i++)
  {
    i++;  // In loop
    printf("%d",i);  // Also in loop
  }
  return 0;
}
4 голосов
/ 01 июля 2019

printf("%d",i); не является частью цикла for, только i++.Отступ не имеет значения в C, вам нужно использовать блоки для группировки операций.Например,

for (int i=1;i<=20;i++) 
{
    i++;
    printf("%d",i); 
}
1 голос
/ 01 июля 2019

C не заботится об отступах (он заботится только о пробелах в той степени, в которой он разделяет токены). Если вы хотите, чтобы несколько операторов входили в цикл for (или цикл while, или оператор if и т. Д.), Необходимо разделить эти операторы фигурными скобками:

for ( i = 0; i < 10; i++ )
  printf( "this statement is part of the loop\n" );
  printf( "this statement is NOT part of the loop\n" );

против

for ( i = 0; i < 10; i++ )
{
  printf( "this statement is part of the loop\n" );
  printf( "so is this\n" );
}

Обычно рекомендуется использовать фигурные скобки, даже если у вас есть только одно утверждение:

while ( some_condition )
{
  do_something();
}

Вы также создали две отдельные переменные с именем i:

int i = 10; // first instance

for ( int i = 1; i <= 20; i++ ) // second instance of i "shadows" the first

Это работает, потому что цикл for создает новый scope , и вы можете иметь переменные в разных областях с одним и тем же именем. Переменная i в цикле for скрывает или скрывает переменную i, объявленную в начале программы. Когда цикл for завершается, объявленный в нем i перестает существовать, поэтому вы печатаете значение i, объявленное в начале программы.

0 голосов
/ 06 июля 2019

Отступ не является обязательной частью для определения блока кода в C.

Согласно этому коду, увеличиваемое значение 'i' является переменной, отличной от той, которую вы хотите.

Эквивалентный код:

int main()
{
  int n=10;
  for(int i=1; i<=20;i++)   
    i++;
  printf("%d",n);
}

Но необходимый код:

int main()
{
  int i=10;
  for(int i=1; i<=20;i++)
  {
    i++;
    printf("%d",i);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...