序列点的概念还有就是GCC产生结果的代码片段我没想到:后递增,函数调用,在GCC
(我用gcc版本4.6.1的Ubuntu/Linaro的4.6.1 -9ubuntu3为目标的i686-Linux的GNU)
[test.c的]
#include <stdio.h>
int *ptr;
int f(void)
{
(*ptr)++;
return 1;
}
int main()
{
int a = 1, b = 2;
ptr = &b;
a = b++ + f() + f() ? b : a;
printf ("b = %d\n", b);
return a;
}
在我的理解,存在在函数调用的序列点。 后增量应该在f()之前发生。
见C99 5.1.2.3: “......被称为序列点,过去评价 应完整及后续评估的无副作用应 已经发生的所有副作用。”
对于此测试用例,可能未指定评估顺序, 但最终结果应该相同。所以我预计b的最终结果是5. 但是,在编译这个案例后用'gcc test.c -std = c99',输出显示b = 3.
然后我用“gcc test.c -std = C99 -S”来看看发生了什么:
movl $1, 28(%esp)
movl $2, 24(%esp)
leal 24(%esp), %eax
movl %eax, ptr
movl 24(%esp), %ebx
call f
leal (%ebx,%eax), %esi
call f
addl %esi, %eax
testl %eax, %eax
setne %al
leal 1(%ebx), %edx
movl %edx, 24(%esp)
testb %al, %al
je .L3
movl 24(%esp), %eax
jmp .L4
.L3:
movl 28(%esp), %eax
.L4:
movl %eax, 28(%esp)
看来,GCC使用评估值f()之前,进行 '++' 术后2 f()的调用。
我也使用llvm-clang来编译这种情况, 和结果显示b = 5,这是我所期望的。
我的理解是不正确的后增量和序列点行为? 或者这是GCC461的已知问题?
欢迎来到StackOverflow!请不要将可能想要复制的程序行粘贴 - 粘贴以供学习。 – 2012-08-21 19:34:42
哦〜OK! 现在我已经删除了一些程序的行数。 感谢您的提醒! :) – 2012-08-24 06:03:23