int main() {
int y;
int x{ y = 5 };
//x is 5
}
¿Cómo es esto posible, ya que y = 5 no es una expresión calculable?
Además, ¿por qué el compilador o el IDE no se quejan de que main () no devuelva un int?
c++
initialization
declaration
assignment-operator
Counterstriker0
fuente
fuente
y = 5
es una expresión y tiene valor5
. ¿Por qué crees que no lo es?return
demain
, vea esta pregunta .y = 5
produce 5 aquí. La posibilidad de que los operadores de asignación devuelvan algo es una característica extraña de C / C ++.Respuestas:
Comenzaré por tu última pregunta
De acuerdo con el estándar C ++ (6.6.1 función principal)
Y relativo a esta pregunta
Del estándar C ++ (8.18 Asignación y operadores de asignación compuesta)
Sp esta declaración
se puede dividir de manera equivalente en dos declaraciones
Además, en C ++ puede incluso hacer una referencia a la variable y de la siguiente manera
Aquí hay un programa demostrativo
Su salida es
Puedes esta declaración
reescribir también como
Sin embargo, tenga en cuenta que hay una diferencia entre estas (que se parecen a las declaraciones anteriores) dos declaraciones.
y
En la primera declaración, la variable
x
tiene el tipoint
. En la segunda declaración, la variablex
tiene el tipostd::initializer_list<int>
.Para que la diferencia sea más visible, vea cómo se generan los valores de los objetos.
La salida del programa es
fuente
Es una asignación, y las asignaciones arrojan valores, es decir, el "tipo no calificado por cv del operando izquierdo", consulte [expr.ass / 3] . Por lo tanto,
y = 5
resulta eny
, que es5
, que se utiliza para inicializarx
.Con respecto a su segunda pregunta, vea cppreference en main (o [basic.start.main / 5] ):
Por lo tanto, el compilador o IDE que le advierte sobre una
return
declaración faltante al final demain
sería completamente erróneo. Es cierto que el hecho de que siempre debasreturn
objetos de execpt sinvoid
funciones es algo así como ... bueno, por razones históricas, supongo.main
fuente
return
uno. -pedanticLos
operator=()
resultados en un valor, que es el valor asignado a la variable. Debido a esto, es posible encadenar tareas como esta:fuente
Si echa un vistazo a la documentación sobre cppreference , verá que
operator=()
devuelve una referencia al objeto que se le asignó. Por lo tanto, una asignación se puede usar como una expresión que devuelve el objeto asignado.Entonces, es solo una tarea normal con llaves.
fuente