Nuevo ámbito de bloque para la statement de selección e iteración.

En C99 para las declaraciones de iteración y las declaraciones de selección, hay nuevos ámbitos de bloque y entiendo que if , while , etc. en sí son bloques como su sub statement también sin { } .

Especificación C11:

6.8.4:

Una statement de selección es un bloque cuyo scope es un subconjunto estricto del scope de su bloque envolvente. Cada subestación asociada es también un bloque cuyo scope es un subconjunto estricto del scope de la statement de selección.

6.8.5

Una statement de iteración es un bloque cuyo scope es un subconjunto estricto del scope de su bloque envolvente. El cuerpo del bucle también es un bloque cuyo scope es un subconjunto estricto del scope de la instrucción de iteración.

Pero si lo hago:

 if( (int a = 10) == 10 ) // error: expected expression before '==' token int j = 10; // error: expected expression before 'int' 

GCC me da errores.

¿Cómo puedo verificar que la nueva regla de C99?

¿Puede alguien darme algunos ejemplos de trabajo?

Lo que estás tratando de lograr simplemente no está permitido por la syntax del lenguaje C. N1570 §6.8.4 / p1:

Sintaxis
statement de selección:
sentencia if (expresión)

Tanto la expresión como la statement no se consideran como una statement ( expresión de statement para mejor estricto). Lo mejor que puedes hacer es poner la statement dentro de los corchetes {} , como:

 int a = 10; if (a == 10) { int j = 10; } 

El único caso permitido por el estándar (e introducido por C99 de hecho) es colocar una statement en lugar de inicializar la expresión en el bucle for :

 for (int a = 0, b = 0; a + b < 20; a++, b++) { int j = 10; } 

La referencia para eso es §6.8.5 / p1 (ver formulario):

Sintaxis
iteración-statement:
sentencia while (expresión)
hacer enunciado while (expresión);
para (expresión opt ; expresión opt ; expresión opt ) statement
for (statement de expresión opt ; expresión opt )

La pregunta real aquí es cuál es el propósito del scope separado de la statement if (a partir de §6.8.4 / p5) si no puede usarla con la expresión de statement. Ves que solo es posible con for loop.

Leí un artículo de Straustrup donde discutió el problema de la integración de C y C ++. Como podemos ver, parece que el problema está sin resolver. Incluso las definiciones de las declaraciones difieren fundamentalmente. En C, la expresión controladora de la sentencia if puede ser solo una expresión. Así, por ejemplo, esta statement.

 if ( const char *p = std::strchr( "Hello", 'H' ) ) { /*...*/ } 

es válido en C ++ pero la statement similar

 if ( char *p = strchr( "Hello", 'H' ) ) { /*...*/ } 

no se vierte en C.

Pero en cualquier caso, su sentencia if no se mostrará en C ++ ni en C. 🙂

 if( (int a = 10) == 10 ) 

Puede haber una expresión o statement. Desde el estándar de C ++

 condition: expression attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list