2

Since b++ is post-increment,what happens to the increment of b if used as return b++ as in the following program?

#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++;
}

Edit

#include<stdio.h>
int foo();

int main()
{
foo();
foo();
}

int foo()
{
    static int b=1;
    printf("%d\n",b);
    return b++;
}

Result

1

2

As I saw in my edit, why is b incremented at all?Isn't return supposed to exit that function immediately?Why is b incremented even after control returns to main()?Aren't all activities in the function supposed to end after return?

4

4 回答 4

5

许多 C(子)表达式都有一个值和一个副作用。

的值b++是计算b表达式之前的值;它的副作用是将值增加b一。

因此,表达式返回和更新return b++;的先前值。什么时候是静态的,更新会保留在下一个函数调用中;当是一个普通的旧局部变量时,更新会丢失(智能编译器甚至不会发出代码来更新对象)。bbbb

于 2013-05-12T08:28:05.313 回答
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

于 2013-05-12T08:15:46.070 回答
3

return b++;相当于: int c = b; b = c + 1; return c;

要回答您的新问题: - 函数确实在 return 之后退出,但在它返回之前,b++必须首先评估表达式。评估这样的表达式将导致b递增。- 函数中的所有活动在返回后“结束”,但b被声明为静态变量,在这种情况下,它的值在函数的后续执行中保持不变。

为了让你更容易理解,一个后增量就像下面的函数

int postincrement(int& x) {
    int y = x;
    x = x + 1;
    return y;
}

(当然编译器可以优化 ab++如果它发现递增b根本没有效果,但在这种情况下它确实有效果(增加静态 int b)所以它不能被优化出来。)

于 2013-05-12T08:06:14.573 回答
1

这个后增量是完全没用的——因为b有本地范围,它的增量值是在return. 如果你的编译器很聪明,它很可能会优化它。

于 2013-05-12T08:06:28.403 回答