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 = 5es una expresión y tiene valor5. ¿Por qué crees que no lo es?returndemain, vea esta pregunta .y = 5produce 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
xtiene el tipoint. En la segunda declaración, la variablextiene 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 = 5resulta 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
returndeclaración faltante al final demainsería completamente erróneo. Es cierto que el hecho de que siempre debasreturnobjetos de execpt sinvoidfunciones es algo así como ... bueno, por razones históricas, supongo.mainfuente
returnuno. -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