如果在函数中使用,“return b ++”中“b”的增量会发生什么变化?

时间:2013-05-12 08:05:06

标签: c return post-increment

由于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}}?函数中的所有活动都不应该在返回后结束吗?

4 个答案:

答案 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之后处理。如果您的编译器很聪明,那么最有可能优化它。