while until statement loop for else cycles c syntax-error conditional-statements variable-declaration

until - loop en c



Error de C: Expresión esperada antes de int (3)

Cuando probé el siguiente código me sale el error mencionado.

if(a==1) int b =10;

Pero lo siguiente es sintácticamente correcto

if(a==1) { int b = 10; }

¿Por qué es esto?


Esta es en realidad una pregunta bastante interesante. No es tan simple como parece al principio. Para referencia, voy a basar esto en la última gramática del lenguaje C11 definida en N1570

Supongo que la parte contraintuitiva de la pregunta es: si esto es correcto C:

if (a == 1) { int b = 10; }

entonces ¿por qué esto no es también correcto C?

if (a == 1) int b = 10;

Quiero decir, una sentencia condicional de una línea if está bien con o sin llaves, ¿no?

La respuesta se encuentra en la gramática de la instrucción if , según lo define el estándar C. Las partes relevantes de la gramática que he citado a continuación. De manera sucinta: la línea int b = 10 es una declaración , no una declaración , y la gramática de la instrucción if requiere una instrucción después del condicional que está probando. Pero si encierras la declaración entre llaves, se convierte en una declaración y todo está bien.

Y solo por responder a la pregunta completamente, esto no tiene nada que ver con el alcance. La variable b que existe dentro de ese alcance será inaccesible desde fuera de él, pero el programa sigue siendo sintácticamente correcto. Estrictamente hablando, el compilador no debería lanzar un error en él. Por supuesto, debes construir con -Wall -Werror todos modos ;-)

(6.7) declaration: declaration-specifiers init-declarator-listopt ; static_assert-declaration (6.7) init-declarator-list: init-declarator init-declarator-list , init-declarator (6.7) init-declarator: declarator declarator = initializer (6.8) statement: labeled-statement compound-statement expression-statement selection-statement iteration-statement jump-statement (6.8.2) compound-statement: { block-item-listopt } (6.8.4) selection-statement: if ( expression ) statement if ( expression ) statement else statement switch ( expression ) statement


Por C89, la variable solo se puede definir en la parte superior de un bloque.

if (a == 1) int b = 10; // it''s just a statement, syntacitially error if (a == 1) { // refer to the beginning of a local block int b = 10; // at the top of the local block, syntacitially correct } // refer to the end of a local block if (a == 1) { func(); int b = 10; // not at the top of the local block, syntacitially error, I guess }


{ } ->

define el alcance, por lo que if(a==1) { int b = 10; } if(a==1) { int b = 10; } dice, está definiendo int b, para {} - este alcance. por

if(a==1) int b =10;

no hay alcance Y no podrás usar b ninguna parte.