Pregunta ¿Qué es esta sintaxis de C ++ que pone un bloque rodeado de refuerzos donde se espera una expresión?


Me encontré con este extraño programa de 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 este constructo?


74
2018-06-10 10:58


origen


Respuestas:


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 de C / C ++. Por lo tanto, cualquier código que use expresión de declaración no es conforme con las normas y no es portátil.

El IBM IBM XL C / C ++ v7.0 también es compatible con Statement Expressions y su documentación lo explica de manera acertada:

Expresiones de declaración: 

Un enunciado compuesto es una secuencia de enunciados encerrados entre llaves. En GNU C, una instrucción compuesta dentro de 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 la construcción completa. Si el último enunciado no es una expresión, entonces el constructo es de tipo vacío y no tiene valor.

Siempre compila tu código seleccionando un sandard en GCC, usa 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 la norma, también debe especificar -pedantic (o -pedantic-errors si quieres que sean errores en lugar de advertencias)


64
2018-06-10 11:02



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


54
2018-06-10 11:07



Crea un alcance en línea, declara x dentro de él, lo lee de la entrada estándar y la declaración completa finalmente evalúa x, que está asignado 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 instrucciones conectadas con comas se ejecutarán secuencialmente, y el resultado de toda la expresión se establecerá en el valor del operando del extremo derecho.


18
2018-06-10 11:01



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


13
2018-06-10 11:02