Цикл for говорит, что синтаксическая ошибка выражения при инициализации целого числа в цикле - PullRequest
6 голосов
/ 28 августа 2010

Во время программирования я натолкнулся на необычную ошибку.Когда я инициализирую целое число в цикле, иногда он говорит, что выражение недопустимо, но иногда оно принимает его.Это мой код, который выдает ошибку:

int pow(int x,int n);
int main()
{
    int x,n,result;
    printf("Enter a number:\n");
    scanf("%d",&x);
    printf("Enter its power:\n");
    scanf("%d",&n);
    result=pow(x,n);
    printf("Result is %d\n",result);
    getch();
    return 0;
}
int pow(int x,int n)
{   
    for(int i=1;i<n;i++)   //<-- here it says that declaration syntax error
    x=x*i;
    return x;
}

Пока я меняю его так:

int pow(int x,int n)
{   
    int i;
    for(i=1;i<n;i++)  
    x=x*i;
    return x;
}

Ответы [ 4 ]

11 голосов
/ 28 августа 2010

C89 и более ранние версии поддерживают только операторы объявления в начале блока (IOW, единственное, что может появиться между открытием { и объявлением - это другое объявление):

/* C89 and earlier */
int main(void)
{
  int x;                      /* this is legal */
  ...
  for (x = 0; x < 10; x++)
  {
    int i;                    /* so is this */
    printf("x = %d\n", x);
    int j = 2*x;              /* ILLEGAL */
  }
  int y;                      /* ILLEGAL */
  ...
}

СC99, операторы объявления могут появляться где угодно, включая управляющие выражения (с оговоркой, что что-то должно быть объявлено перед использованием):

// C99 and later, C++
int main(void)
{
  int x;                       // same as before
  ...
  for (int i = 0; i < 10; i++) // supported as of C99
  {
    printf("i = %d\n", i);
    int j = 2 * i;             // supported as of C99
  }
  int y;                       // supported as of C99
}

Turbo C предшествует стандарту C99, так что если вы хотите написатькод, как во втором примере, вам нужно будет использовать более современный компилятор.

9 голосов
/ 28 августа 2010

В C, до C99, вам нужно объявить переменные перед циклом.В C ++, а теперь и в C99, вы можете объявить их в цикле, как вы пытаетесь здесь.Различные результаты, которые вы получаете, могут быть вызваны тем, что вы иногда компилируете как C ++, а иногда компилируете как C.

Вы можете попытаться убедиться, что вы всегда компилируете свой код как C ++, или если вы используете GCCили Clang, скомпилируйте с флагом --std=c99.C99 не поддерживается MSVC, поэтому вам придется либо использовать C ++, либо переместить объявление за пределы цикла, если вы используете MSVC.

5 голосов
/ 28 августа 2010

Похоже, у вас есть компилятор C89 (а не компилятор C99).

В C89 вам разрешено объявлять переменные только в начале функции. Вам просто не разрешено объявлять переменные где-либо еще в функции, в том числе в части инициализации оператора for. Вот почему второй синтаксис работает, а первый не работает.

Второй синтаксис действителен для C99 и C ++, но не для C89.

2 голосов
/ 28 августа 2010

Какой компилятор C вы используете?

Более старые версии C до C99 требуют, чтобы все объявления переменных были сделаны в верхней части блока кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...