¿Qué es esta sintaxis de C ++ que coloca un bloqueo de abrazadera donde se espera una expresión?

StackOverflow https://stackoverflow.com/questions/6305396

Pregunta

Encontré este extraño programa C ++.

#include <iostream>
using namespace std;
int main()
{
  int a = ({int x; cin >> x; x;});
  cout << a;
}

¿Puede alguien explicar qué está pasando? ¿Cómo se llama esta construcción?

¿Fue útil?

Solución

Asigna el valor de entrada del usuario a a y lo imprime. se hace usando un Statement Expression.

Las expresiones de declaración son Extensión del compilador GNU GCC no son compatibles con los estándares C/C ++. Por lo tanto, cualquier código que use la expresión de la declaración no sea estándar y no es portátil.

El IBM IBM XL C/C ++ V7.0 también admite expresiones de declaración y su doccumentación los explica acertadamente:

Expresiones de declaración:

Una declaración compuesta es una secuencia de declaraciones encerradas por aparatos ortopédicos. En Gnu C, una declaración compuesta dentro de los paréntesis puede aparecer como una expresión en lo que se llama Statement expression.

         .--------------.
         V              |
>>-(--{----statement--;-+--}--)--------------------------------><

El valor de una expresión de declaración es el valor de la última expresión simple que aparece en toda la construcción. Si la última declaración no es una expresión, entonces la construcción es de tipo vacío y no tiene valor.

Compile siempre su código seleccionando un Sandard en GCC, use una de las opciones -ansi, -std=c90 o -std=iso9899:1990, -std=c++03, -std=c++0x; Para obtener todos los diagnósticos requeridos por el estándar, también debe especificar -pedantic (o -pedantic-errors Si quieres que sean errores en lugar de advertencias)

Otros consejos

Es una extensión de GCC. Compilar su código con el -pedantic bandera si quieres deshacerte de cosas como esta (y realmente hacer querer).

Crea un alcance en línea, declara x dentro de él, lo lee de la entrada estándar y toda la declaración finalmente evalúa a x, que se asigna a a.

El operador de coma funciona de manera similar, aunque no requiere un alcance separado. Por ejemplo:

int x;
int a = (cin >> x, x);

haría lo mismo. Todas las declaraciones conectadas con comas se ejecutarán secuencialmente, y el resultado de toda la expresión se establecerá en el valor del operando más a la derecha.

No creo que este sea C ++ estándar. Probablemente sea una extensión específica del compilador que permite que un alcance interno evalúe un valor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top