Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “的增量会发生什么变化?”;b";在;返回b++&引用,如果在函数中使用?_C_Return_Post Increment - Fatal编程技术网

C “的增量会发生什么变化?”;b";在;返回b++&引用,如果在函数中使用?

C “的增量会发生什么变化?”;b";在;返回b++&引用,如果在函数中使用?,c,return,post-increment,C,Return,Post Increment,由于b++是后增量,如果在下面的程序中用作返回b++,则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++; } #包括 int foo(int); int main() { INTA=8; printf(“%d”,foo(a));

由于
b++
是后增量,如果在下面的程序中用作
返回b++
,则
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++;
}
#包括
int foo(int);
int main()
{
INTA=8;
printf(“%d”,foo(a));
}
int foo(int a)
{
静态int b=a*a;
返回b++;
}
编辑

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

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

int foo()
{
    static int b=1;
    printf("%d\n",b);
    return b++;
}
#包括
int foo();
int main()
{
foo();
foo();
}
int foo()
{
静态int b=1;
printf(“%d\n”,b);
返回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
即使在控件返回
main()
之后也会增加?函数中的所有活动不应该在返回后结束?
返回b++相当于:
intc=b;b=c+1;返回c

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

为了便于理解,post增量类似于以下函数

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

(当然,如果编译器发现递增的
b
没有任何效果,那么它可以优化a
b++
,但在这种情况下它确实有效果(增加静态int
b
),因此无法对其进行优化。)

这个后增量是完全无用的-因为
b
具有局部范围,它的增量值在
返回后处理。如果你的编译器很聪明,它很可能会对它进行优化。

实际上,这段代码不会编译,因为
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
之前初始化

许多C(sub-)表达式都有值和副作用

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

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

你错了。根据mvp的回答,增量永远不会发生,因为函数在
返回b++
之后返回控件。增量永远不会发生。b是一个静态变量,因此增量会发生,因为它会在调用
foo
@steve之间保持其状态。函数的所有活动都不应该在调用后停止
return
?如果在
return
之后有一个
printf()
,它会被忽略。例如,为什么会发生增量操作?@Thokchom请查看我上面的编辑。正如您所看到的,增量确实发生了。@Thokchom:If
返回printf(“hi!\n”),这也会运行。将对表达式进行求值,并会出现任何可见的副作用。(表达式的任何副作用都是无法观察到的,编译器可以自由地进行优化……但这不是必须的。)b的增量永远不会发生,对吗?那么Javic的答案不是错了吗?这取决于编译器有多聪明。这很可能不会发生。但是,如果
b
不是
int
,而是通过引用传递的某个对象,并且
operator++
被重新定义,那么这将产生一些副作用。你们都错了,上面的代码不能编译为C,因为
a
不是常量值。我写了一个答案,它也解释了C++解决方案,代码是有效的。@ MatsPetersson,请检查我的编辑,我将张贴。它似乎同意你说的,违背了以前的答案。注意关键字<代码>静态< /代码>关于<代码> b>代码>。此代码不使用C编译器编译。一个C++编译器执行它,行为是“你所期望的”。检查我编辑的程序。第一个没有很好地表达我的观点。为什么<代码> b>代码>递增?是否所有函数都在一次函数中预期结束一次?<代码>返回< /代码>?不应该<代码>脚注()/ <代码>返回<代码> b>代码>并将控制传递给<代码>主()
而不是递增
b
?否,
返回b++
将执行
b++
,然后从中返回给定的值-这是
b
的“旧”值。这确实很有用。我指的是第一行。