¡Todo lo que dije originalmente es INCORRECTO! El punto en el tiempo en el que se calcula el efecto secundario es no especificado. Visual C++ realizará el incremento después de la llamada a foo() si la prueba es una variable local, pero si la prueba se declara como estática o global, se incrementará antes de la llamada a foo() y producirá resultados diferentes, aunque el valor final de la prueba será correcta.
El incremento realmente debe hacerse en una declaración separada después de la llamada a foo(). Incluso si el comportamiento se especificara en el estándar C/C++, sería confuso. Se podría pensar que los compiladores C++ marcarían esto como un posible error.
Here es una buena descripción de los puntos de secuencia y el comportamiento no especificado.
< ---- INICIO DE MAL MAL MAL ---->
El "++" poco de "prueba ++" es ejecutado después de la llamada a foo. Así se pasa en (0,0) a foo, no (1,0)
Aquí está la salida del ensamblador desde Visual Studio 2002:
mov ecx, DWORD PTR _i$[ebp]
push ecx
mov edx, DWORD PTR tv66[ebp]
push edx
call _foo
add esp, 8
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
El incremento se realiza después de la llamada a foo() .Si bien este comportamiento es por diseño, es ciertamente confuso para el lector casual y probablemente debería evitarse. El incremento realmente debe hacerse en una declaración separada después de la llamada a foo()
< ---- FIN DEL MAL MAL MAL ---->
¿Quizás su descripción/ejemplo debería incluir la pregunta del título? –
El título y el ejemplo del código no coinciden – itj
La pregunta se confunde entre el título y el ejemplo del código. el título tiene ++ n el ejemplo tiene la prueba ++ – itj