¿Cómo explicamos el resultado de la expresión (++ x) + (++ x) + (++ x)?

x = 1; std::cout << ((++x)+(++x)+(++x)); 

Espero que la salida sea 11 , pero en realidad es 12 . ¿Por qué?

Lo explicamos esperando un comportamiento indefinido en lugar de un resultado particular. Como la expresión intenta modificar x varias veces sin un punto de secuencia intermedio , su comportamiento no está definido .

Como han dicho otros, los estándares C y C ++ no definen el comportamiento que esto producirá.

Pero para aquellas personas que no entienden por qué los estándares harían tal cosa, veamos un ejemplo del “mundo real”:

 1 * 2 + 3 + 4 * 5 

No hay nada de malo en calcular 1 * 2 + 3 antes de calcular 4*5 . El hecho de que la multiplicación tenga una precedencia mayor que la sum no significa que tengamos que realizar todas las multiplicaciones en la expresión antes de hacer cualquier sum. De hecho, hay muchos pedidos diferentes que válidamente podría realizar sus cálculos.

Cuando las evaluaciones tienen efectos secundarios, diferentes órdenes de evaluación pueden afectar el resultado. Si el estándar no define el comportamiento, no confíe en él .

Esto en realidad no está definido. C ++ no define explícitamente el orden de ejecución de una statement, por lo que depende del comstackdor y esta syntax no debe utilizarse.

El fragmento de código invocará el comportamiento indefinido en C / C ++. Lea sobre el punto de secuencia desde aquí .

en mi opinión

 cout< <((++x)+(++x)+(++x)); 

el comstackdor ejecuta primero el prefijo ++ x, de modo que el valor de x se convierte

x = 2


ahora por ++ x, x se convertirá

x = 3


después de ++ x

x = 4


Ahora es el momento de agregar valores de x

x + x + x = 4 + 4 + 4

x + x + x = 12