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?
c++
syntax
language-extension
gcc-extensions
Koshimitsu
fuente
fuente
Respuestas:
Asigna un valor de entrada del usuario
a
y lo imprime. se hace usando aStatement 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:
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)fuente
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).fuente
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 ax
, que se asigna aa
.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.
fuente
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.
fuente