programas paso ejemplos dev completo comandos basicos c++ c

paso - ¿Cuál es el resultado de+= en C y C++?



ejemplos de programas en c++ pdf (2)

Además de ser código C no válido, la línea

(i+=10)+=10;

daría como resultado un comportamiento indefinido en C y C ++ 03 porque modificaría i dos veces entre los puntos de la secuencia.

En cuanto a por qué está permitido compilar en C ++:

[C ++ N3242 5.17.1] El operador de asignación (=) y los operadores de asignación compuesta todos los grupos de derecha a izquierda. Todos requieren un valor l modificable como su operando izquierdo y devuelve un valor l referente al operando de la izquierda.

El mismo párrafo continúa diciendo que

En todos los casos, la asignación se secuencia después del cálculo del valor de los operandos derecho e izquierdo, y antes del cálculo del valor de la expresión de asignación.

Esto sugiere que en C ++ 11, la expresión ya no tiene un comportamiento indefinido.

Tengo el siguiente código:

#include <stdio.h> int main(int argc, char **argv) { int i = 0; (i+=10)+=10; printf("i = %d/n", i); return 0; }

Si trato de compilarlo como fuente C usando gcc, aparece un error:

error: lvalue required as left operand of assignment

Pero si lo compilo como una fuente de C ++ usando g ++, no obtengo ningún error y cuando ejecuto el ejecutable:

i = 20

¿Por qué el comportamiento diferente?


La semántica de los operadores de asignación compuesta es diferente en C y C ++:

C99 estándar, 6.5.16, parte 3:

Un operador de asignación almacena un valor en el objeto designado por el operando de la izquierda. Una expresión de asignación tiene el valor del operando izquierdo después de la asignación, pero no es un valor l.

En C ++ 5.17.1:

El operador de asignación (=) y los operadores de asignación compuesta todos agrupan de derecha a izquierda. Todos requieren un valor l modi fi cable como su operando izquierdo y devuelven un valor l con el tipo y el valor del operando izquierdo una vez que la asignación ha tenido lugar.

EDITAR: El comportamiento de (i+=10)+=10 en C ++ no está definido en C ++ 98, pero está bien definido en C ++ 11. Vea esta respuesta a la pregunta de NPE sobre las partes relevantes de los estándares.