Все, что я сказал первоначально, НЕПРАВИЛЬНО! Точка времени, в течение которого вычисляется боковое воздействие , составляет не указано. Visual C++ будет выполнять приращение после вызова функции foo(), если test является локальной переменной, но если тест объявлен как статический или глобальный, он будет увеличен до вызова функции foo() и даст разные результаты, хотя конечное значение тест будет правильным.
Приращение должно выполняться в отдельном заявлении после вызова функции foo(). Даже если поведение было указано в стандарте C/C++, это было бы запутанным. Вы могли бы подумать, что компиляторы C++ означают это как потенциальную ошибку.
Here - хорошее описание точек последовательности и неуказанного поведения.
< ---- ПУСК НЕПРАВИЛЬНО НЕПРАВИЛЬНО НЕПРАВИЛЬНО ---->
"++" бит "тест ++" запускается на выполнение после вызова Foo. Таким образом, вы передаете в (0,0) в Foo, а не (1,0)
Вот выход ассемблер из 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
Приращение выполняется после вызова Foo() ,Хотя это поведение по дизайну, это, безусловно, запутывает случайного читателя и, вероятно, его следует избегать. Приращение должно действительно быть сделано в отдельном заявлении, после вызова Foo()
< ---- КОНЕЦ НЕПРАВИЛЬНО НЕПРАВИЛЬНО НЕПРАВИЛЬНО ---->
Возможно, ваше описание/пример должно полностью включать вопрос названия? – 2008-09-19 00:18:52
Неверный заголовок и пример кода – itj 2008-09-19 08:02:24
Вопрос путается между заголовком и примером кода. title имеет ++ n пример имеет тест ++ – itj 2008-09-19 08:05:16