这里的问题是你似乎不明白undefined behavior 的意思。
当您调用未定义的行为时,任何事情都可能发生。您的程序可能会崩溃,可能会产生意想不到的结果,或者看起来可以正常工作。进行看似无关的更改,例如添加未使用的变量或额外调用 printf,可能会改变未定义行为的表现方式。
这也意味着两个不同的编译器可以为相同的代码生成不同的结果,或者一个具有两种不同优化设置的编译器可以生成不同的结果。
我给你举个例子。我在带有 gcc 4.1.2 的 CentOS 5.10 上编译了您的原始代码。首先我编译没有任何优化:
gcc -Wall -Wextra -g -o /tmp/x1 /tmp/x1.c
我运行了生成的代码,然后运行了echo $?。后者打印前一个进程的退出代码(即main的返回值)。结果:
[dbush@db-centos tmp]$ /tmp/x1
[dbush@db-centos tmp]$ echo $?
3
[dbush@db-centos tmp]$
现在我将在 Windows 7 机器上的 Visual Studio 2010 下编译相同的代码:
cl x1.c
如果我运行这个然后echo %ERRORLEVEL% 打印返回码,我会得到这个:
C:\Users\dbush\Documents>x1
C:\Users\dbush\Documents>echo %ERRORLEVEL%
0
C:\Users\dbush\Documents>
如您所见,gcc 和 MSVC 为相同的代码生成不同的结果。在一种情况下它返回 3,而在另一种情况下它返回 0。
现在让我们开始优化。我在同一台 CentOS 机器上用相同版本的 gcc 编译了相同的代码,但开启了优化:
gcc -Wall -Wextra -g -o /tmp/x1 /tmp/x1.c -O3
然后我运行了两次。然后我得到以下结果:
[dbush@db-centos tmp]$ /tmp/x1
[dbush@db-centos tmp]$ echo $?
68
[dbush@db-centos tmp]$ /tmp/x1
[dbush@db-centos tmp]$ echo $?
36
[dbush@db-centos tmp]$
因此,我不仅在使用不同的优化设置运行时会得到不同的结果,而且在运行同一程序多次时会得到不同的结果。这就是未定义行为可能发生的情况。
所以要回答您的问题“将产生什么返回值”,答案取决于您调用了未定义的行为。你无法可靠地预测会发生什么。
编辑:
更新代码的更多示例。
在没有优化的 gcc 上:
[dbush@db-centos tmp]$ /tmp/x1
mytest2 = 3
[dbush@db-centos tmp]$ echo $?
12
在 gcc 上优化 -O3:
[dbush@db-centos tmp]$ /tmp/x1
mytest2 = -1078711820
[dbush@db-centos tmp]$ echo $?
22
[dbush@db-centos tmp]$ /tmp/x1
mytest2 = -1077511916
[dbush@db-centos tmp]$ echo $?
22
在没有优化的 MSVC 上:
C:\Users\dbush\Documents>x1
mytest2 = 3
C:\Users\dbush\Documents>echo %ERRORLEVEL%
0
C:\Users\dbush\Documents>
在 MSVC 上进行优化 /Ox:
C:\Users\dbush\Documents>x1
mytest2 = 1
C:\Users\dbush\Documents>echo %ERRORLEVEL%
0
C:\Users\dbush\Documents>
同样,没有保证。