2011-01-23 19 views
6

Cuando he siguiente:¿Por qué obtengo el "identificador de error no declarado" a menos que declare mi variable al principio?

#include "stdafx.h" 
#include<stdio.h> 
int main() 
{ 

int val1,val2; 

printf("Enter the first value"); 
scanf("%d",val1); 
scanf("%d",&val2); 
int c; 
c=val1 + val2; 
printf(" the value is : %d", c); 



return 0; // 0 means no error 

} 

me sale error de identificador no declarado c. Además, error de sintaxis. desaparecido ; antes tipo.

Sin embargo, si cambio arriba, desaparecerá el siguiente error. Por favor, ayuda

#include "stdafx.h" 
#include<stdio.h> 

int main() 
{ 

int val1,val2,c; 

printf("Enter the first value"); 
scanf("%d",&val1); 
scanf("%d",&val2); 

c=val1 + val2; 
printf(" the value is : %d", c); 



return 0; // 0 means no error 

} 

Me postulo C en VS 2010.

Respuesta

4

En C, al menos en los viejos días, las declaraciones de variables tienen que venir en la parte superior del bloque. C++ es diferente en ese sentido.

edit — aparentemente C99 es diferente de C90 a este respecto (C99 es esencialmente el mismo que C++ en este tema).

+0

¿Cómo funciona para C en 2010 vs – Programmer

+0

VS2010 en silencio "amplía" el concepto de un programa en C válida – mbaitoff

+0

@mbaitoff: VS2010 no tiene el concepto de un programa C. Solo compila programas en C++. Necesita MinGW si aún desea compilar programas C en Windows. –

0

En C90, las variables locales deben todo ser declarado al comienzo de un función bloque.

+1

De hecho, solo necesitan declararse al comienzo de un * bloque de instrucción *. – Clifford

+0

@Clifford: Buena captura. –

0

Microsoft decidió no admitir las revisiones más nuevas del lenguaje C, por lo que no puede mezclar el código y las declaraciones. Con MSVC, básicamente está atascado con C90, aunque algunas características seleccionadas (por ejemplo, long long, restrict) son compatibles.

Mi recomendación sería cambiar a C++ o usar un compilador diferente como el MinGW edition of GCC.

0

Una observación más. scanf() quiere la DIRECCIÓN del destino, no su valor.

en el ejemplo de la parte superior que está omitiendo el & en scanf ("% d", val1);. En el ejemplo inferior se incluye scanf ("% d", & val1);

"val1" vs "& val1"

no debe cambiar el problema con la variable 'c', pero probablemente causando un error de sintaxis en alguna parte?

3

Los objetos solo pueden declararse en la parte superior de un bloque de instrucciones en ISO C90. Por lo tanto, puede hacer esto:

#include<stdio.h> 

int main() 
{ 
    int val1,val2; 

    printf("Enter the first value"); 
    scanf("%d",val1); 
    scanf("%d",&val2); 

    // New statement block 
    { 
     int c; 
     c=val1 + val2; 
     printf(" the value is : %d", c); 
    } 

    return 0; // 0 means no error 
} 

Aunque tal vez sea inusual hacerlo. Contrariamente a la creencia popular, el inicio de una función no es el único lugar donde puedes declarar una variable automática. Es más común, en lugar de crear un bloque ficticio, utilizar bloques de instrucciones existentes introducidos como parte de una construcción if o for por ejemplo.

Es útil para encerrar case bloques en {...}, A pesar de que normalmente no es necesario, para que pueda introducir el caso temporal variables específicas:

switch(x) 
{ 
    case SOMETHING : 
    { 
     int case_local = 0 ; 
    } 
    break ; 

    ... 
} 
Cuestiones relacionadas