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 esta construcció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 esta construcción?
Respuestas:
Asigna un valor de entrada del usuario a
y lo imprime. se hace usando a Statement Expression
.
Las expresiones de declaración son extensiones del compilador gnu gcc que no son compatibles con los estándares C / C ++. Por lo tanto, cualquier código que utilice expresiones de declaración no cumple con los estándares ni es portátil.
IBM IBM XL C / C ++ v7.0 también admite expresiones de declaración y su documentación las explica adecuadamente:
Expresiones de declaración:
Una declaración compuesta es una secuencia de declaraciones entre llaves. En GNU C, una declaración compuesta entre paréntesis puede aparecer como una expresión en lo que se llama a
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 la última declaración no es una expresión, entonces la construcción es de tipo void y no tiene valor.
Siempre compilar el código seleccionando un sandard en GCC, utilice 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 desea que sean errores en lugar de advertencias)
Es una extensión de GCC. Compilar el código con el -pedantic
indicador si desea deshacerse de cosas como esta (y que realmente no quiere).
Crea un alcance en línea, declara x
dentro de él, lo lee de la entrada estándar y finalmente se evalúa la declaración completa 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 sentencias conectadas con comas se ejecutarán secuencialmente y el resultado de toda la expresión se establecerá en el valor del operando situado más a la derecha.
No creo que esto sea C ++ estándar. Probablemente sea una extensión específica del compilador que permite que un ámbito interno evalúe un valor.