7
votes

Pour la boucle dit Erreur de syntaxe d'expression lors de l'initialisation de l'entier dans la boucle

Lors de la programmation, je suis arrivé à une erreur inhabituelle. Lorsque j'initialise un entier dans une boucle, il est parfois dit que l'expression n'est pas valide, mais elle l'accepte parfois. Ceci est mon code qui donne une erreur: xxx pré>

tandis que lorsque je le change comme ça: P>

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

c

0 commentaires

4 Réponses :


9
votes

en C, avant C99, vous devez déclarer vos variables avant votre boucle. En C ++, et maintenant en C99, vous pouvez les déclarer dans la boucle lorsque vous essayez ici. Les différents résultats que vous obtenez peuvent être parce que vous compilez parfois C ++ et compilez parfois comme c.

Vous pouvez essayer de vous assurer que vous compilez toujours votre code comme C ++ ou si vous utilisez GCC ou SLIG, compilez avec le drapeau - std = C99 . C99 n'est pas pris en charge par MSVC, vous devez donc utiliser C ++ ou déplacer la déclaration en dehors de la boucle si vous utilisez MSVC.


2 commentaires

@Fahad Désolé, je ne peux pas vous aider avec les spécificités de Turbo C. Comme je l'ai dit, si vous souhaitez que le premier exemple fonctionne, assurez-vous de la définir sur C ++ ou en mode C99 (probablement C ++, je ne pense pas Turbo C Supporte C99).


Merci beaucoup :) Je vais trouver ming gw pour ça.



2
votes

Quel compilateur C utilisez-vous?

Les versions plus anciennes de C antérieur à C99 nécessitent toutes les déclarations variables en haut d'un bloc de code.


4 commentaires

quelle version de turbo c? Si je me souviens de quelque chose du collège en Inde, c'est que les compilateurs Turbo C et Borland C étaient plus âgés que les professeurs. Les chances sont que vous êtes confrontés au même problème.


La dernière version de Borland Turbo C était en 1989 (il y a vingt-un ans!). Cela expliquerait pourquoi il ne supporte pas les fonctionnalités instituées une décennie après sa création. Je vous suggère fortement que vous obtenez un nouveau compilateur, pour de nombreuses raisons. Mingw est un excellent compilateur de C99 moderne gratuit pour Windows basé sur GCC. Microsoft VC ++ Express Edition est également gratuit et moderne, mais uniquement un compilateur C89 lorsqu'il fonctionne avec C code C.


@bluesMoon: Oui, c'est son compilateur Turbo C 3.0 (Borland)


Turbo C 3.0 ne peut même pas être conforme au C89, mais IIRC Il était plus proche que tout compilateur MS à la même époque que Borland ait participé ou au moins accordé l'attention sur le processus de normalisation. Il a fallu plus de temps pour Mme pour rejoindre cette fête ...



5
votes

On dirait que vous avez un compilateur C89 (compilateur plutôt que C99).

en C89, vous n'êtes autorisé à déclarer que des variables au début d'une fonction. Vous n'êtes tout simplement pas autorisé à déclarer des variables ailleurs dans une fonction, y compris dans la partie d'initialisation d'un pour . C'est pourquoi la deuxième syntaxe fonctionne et le premier échoue.

La deuxième syntaxe est valide pour C99 et C ++ mais pas pour C89.


2 commentaires

Pouvez-vous ajouter à votre question un extrait de code où vous déclarez la variable à l'intérieur du pour instruction et cela fonctionne? Sans cela pour comparer la version non fonctionnelle, il n'ya aucun moyen de vous dire quelle est la différence.


Vous avez posté une pièce de code où vous le déclarez à l'intérieur le pour instruction, et cela ne fonctionne pas. Ensuite, vous avez un autre morceau de code où vous le déclarez avant le pour instruction et cela fonctionne. La raison pour laquelle ils produisent des résultats différents sont parce qu'ils déclarent la variable à différents endroits. L'un d'entre eux déclare la variable dans un lieu juridique et l'autre déclare la variable dans un lieu illégal. Tout comme n'importe quoi d'autre dans la programmation, les temps où cela fonctionne sont les moments où vous l'écrivez la bonne et légale.



12
votes

C89 et les versions antérieures ne prennent en charge que les relevés de déclaration à la tête d'un bloc (iow, la seule chose qui peut apparaître entre une ouverture { code> et une déclaration est une autre déclaration):

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


0 commentaires