这是C代码快照:意外静态变量地址行为
int* f(int x) {
static int y;
y = x * x;
return &y;
}
float* g(float x) {
static float y;
y = x * x;
return &y;
}
int main(void) {
printf("*f(1)=%d\n", *f(1));
printf("*f(2)=%d\n", *f(2));
printf("*f(1) + *f(2)=%d\n", *f(1) + *f(2));
printf("*g(1.0)=%f\n", *g(1.0));
printf("*g(2.0)=%f\n", *g(2.0));
printf("*g(1.0) + *g(2.0)=%f\n", *g(1.0) + *g(2.0));
return 0;
}
的输出是:
*f(1)=1
*f(2)=4
*f(1) + *f(2)=5
*g(1.0)=1.000000
*g(2.0)=4.000000
*g(1.0) + *g(2.0)=8.000000
而且我不真正了解选自F双重行为()和g() 。首先,我怀疑这是一个编译器问题,但是BCC或GCC提供相同的输出。
不应该*f(1) + *f(2)
输出等于*g(1.0) + g(2.0)
? (5
5.0
或8
8.0
)
这是未指定的或未定义的行为;这里没有明确的评估顺序。 –
我相信奥利是正确的。为了更加明确,这将取决于添加之前的值如何存储。如果在存储该值之前执行'* g(1.0)',然后执行'* g(2.0)',您将添加'4.0 + 4.0 = 8.0'(请记住,每个指针指向相同静态变量的值)。否则,如果执行'* g(1.0)'并将其值存储在寄存器中,则执行'* g(2.0)'并添加结果,您将得到'1.0 + 4.0 = 5.0'。 – RageD
[来自C faq的相关问题](http://c-faq.com/expr/evalorder2.html);基本上,如果要保证它们被调用的顺序,您需要将函数调用放在单独的语句中。 – hugomg