コードを表現するためにコンパイラが実行した正確な手順を確認するために、逆アセンブリを調べました。
行 00324C2E は、グローバル変数「val」の値を CPU の eax レジスタにコピーします。
行 00324C33 は、値を eax から「foo」関数のローカル スタック スペースにコピーします。
行 00324C39 は、グローバル変数「val」の値を CPU の ecx レジスタにコピーします。
行 00324C3F は、ecx レジスターの値に 1 を追加します。
行 00324C42 は、インクリメントされた値を ecx レジスタからグローバル変数「var」にコピーします。
行 00324C48 は、「foo」関数のローカル スタック スペース (上記の行 00324C33 を参照) に格納された値の影響を受けないコピーを CPU の eax レジスタにコピーします。これは、呼び出し元の関数 (この場合は "main") に返される値であるため、eax レジスタにコピーされます。
したがって、foo() からは 0 が返されますが、foo() が返された後、グローバル変数「val」には 1 が含まれます。
int foo()
{
00324C10 push ebp
00324C11 mov ebp,esp
00324C13 sub esp,0C4h
00324C19 push ebx
00324C1A push esi
00324C1B push edi
00324C1C lea edi,[ebp-0C4h]
00324C22 mov ecx,31h
00324C27 mov eax,0CCCCCCCCh
00324C2C rep stos dword ptr es:[edi]
return val++;
00324C2E mov eax,dword ptr ds:[0032F320h]
00324C33 mov dword ptr [ebp-0C4h],eax
00324C39 mov ecx,dword ptr ds:[32F320h]
00324C3F add ecx,1
00324C42 mov dword ptr ds:[32F320h],ecx
00324C48 mov eax,dword ptr [ebp-0C4h]
}