2010-08-27 15 views
5

Durante la programación he llegado a un error inusual. Cuando inicializo un entero en un bucle, a veces dice que la expresión no es válida, pero a veces lo acepta. Este es mi código que da el error:Para bucle dice error de sintaxis de expresión al inicializar entero en el bucle

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

Mientras que cuando cambio de esta manera:

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

Respuesta

8

C89 y versiones anteriores sólo son compatibles con instrucciones de declaración a la cabeza de un bloque (OIA, la única cosa que puede aparecer entre una abertura { y una declaración es otra declaración):

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

Con C99, declaración declaraciones pueden aparecer casi en cualquier lugar, incluyendo expresiones de control (con la advertencia de que algo debe ser declarado antes de su uso):

// 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 es anterior a la norma C99, por lo que si desea escribir código como en el Segundo ejemplo, necesitarás usar un compilador más actualizado.

+0

Thanx.Realmente ayudado –

9

En C, antes de C99, que tienen que declarar las variables antes de su bucle. En C++, y ahora en C99, puede declararlos dentro del bucle mientras intenta aquí. Los diferentes resultados que obtiene pueden ser porque a veces compila como C++ y, a veces compilando como C.

Puede intentar asegurarse de que siempre está compilando su código como C++, o si está utilizando GCC o Clang , compilar con la bandera --std=c99. C99 no es compatible con MSVC, por lo que deberá usar C++ o mover la declaración fuera del ciclo si está utilizando MSVC.

+0

Uso un compilador turbo c –

+0

@fahad Disculpe, no puedo ayudarle con los detalles de Turbo C. Como dije, si desea que el primer ejemplo funcione, asegúrese de configurarlo en modo C++ o C99 (probablemente C++, no creo que Turbo C sea compatible con C99). –

+1

Muchas gracias :) Encontraré a Ming GW para eso. –

2

¿Qué compilador de C estás utilizando?

Las versiones anteriores de C anteriores a C99 requieren que todas las declaraciones de variables se realicen en la parte superior de un bloque de códigos.

+0

el compilador turbo c –

+0

¿qué versión de turbo c? Si recuerdo algo de la universidad en India, es que los compiladores de turbo C y borland C que teníamos eran más antiguos que los profesores. lo más probable es que estés enfrentando el mismo problema. – bluesmoon

+0

El último lanzamiento de Borland Turbo C fue en 1989 (¡hace veintiún años!). Eso explicaría por qué no admite características instituidas una década después de su creación. Le sugiero encarecidamente que obtenga un compilador más nuevo, por muchas razones. MinGW es un compilador C99 excelente, gratuito y moderno para Windows basado en gcc. Microsoft VC++ Express Edition también es gratuito y moderno, pero solo es un compilador C89 cuando está trabajando con código C. –

5

Parece que tiene un compilador C89 (en lugar del compilador C99).

En C89, solo está permitido declarar variables al principio de una función. Simplemente no puede declarar variables en ningún otro lugar de una función, incluida la parte de inicialización de una declaración for. Es por eso que la segunda sintaxis funciona y la primera falla.

La segunda sintaxis es válida para C99 y C++ pero no para C89.

+0

pero a veces funciona. ¿Por qué sucede eso? –

+0

¿Puede agregar a su pregunta un fragmento de código donde declara la variable dentro de la declaración 'for' y funciona? Sin eso para comparar la versión que no funciona, no hay forma de decirle cuál es la diferencia. –

+0

Si ve el código que he hecho que –