由于b++
是后递增的,如果b
用作return b++
的增量,会发生什么?如以下程序?
#include<stdio.h>
int foo(int);
int main()
{
int a=8;
printf("%d",foo(a));
}
int foo(int a)
{
static int b=a*a;
return b++;
}
修改
#include<stdio.h>
int foo();
int main()
{
foo();
foo();
}
int foo()
{
static int b=1;
printf("%d\n",b);
return b++;
}
结果
1
2
正如我在编辑中看到的那样,b
为什么会增加?是不是return
应该立即退出该函数?为什么b
即使在控制返回{后也会增加{1}}?函数中的所有活动都不应该在返回后结束吗?
答案 0 :(得分:5)
许多C(子)表达式具有值和副作用。
在评估表达式之前,b++
的值是b
的值;它的副作用是将b
中的值增加一个。
因此,表达式return b++;
会返回先前的b
值并更新b
。
当b
为静态时,更新将保留在下一个函数调用中;
当b
是一个普通的旧局部变量时,更新就会丢失(智能编译器甚至不会发出代码来更新对象)。
答案 1 :(得分:4)
实际上,此代码无法编译,因为b
的初始化程序不是常量。
由于b
是静态的,它本质上是一个全局变量,它在main
之前被初始化,此时a
不存在。
另一方面,如果我们将其编译为C ++,则b
在第一次调用foo
时初始化 - 因此得到值64.在返回时,b++
递增并存储为65 - 但返回值为64.因此,如果再次调用foo
,它将返回65(并且b
为66)。
根据编辑过的代码进行编辑:
因此,代码基本上执行:
int temp = b;
b = b + 1;
return temp;
这是C定义的方式。 x++
的结果是之前的值x
,但x
的值是递增的。由于static
本质上是一个全局(但没有名称,所以你不能在该函数之外使用它),该值在函数调用之间持续存在,并在调用main
之前初始化。
答案 2 :(得分:3)
return b++;
相当于:
int c = b; b = c + 1; return c;
回答您的新问题:
- 函数在返回后退出,但在返回之前,必须首先计算表达式b++
。评估这样的表达式将导致b
递增。
- 返回后函数“end”中的所有活动,但b
被声明为静态变量,在这种情况下,它的值会在后续执行函数时持续存在。
为了便于您理解,后增量类似于以下函数
int postincrement(int& x) {
int y = x;
x = x + 1;
return y;
}
(当然,如果编译器发现递增b++
根本没有效果,编译器可以优化b
,但在这种情况下它确实有效(增加静态int b
})因此无法优化。)
答案 3 :(得分:1)
此后增量完全没用 - 因为b
具有局部范围,其增量值将在return
之后处理。如果您的编译器很聪明,那么最有可能优化它。