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
没有任何效果,那么它可以优化ab++
,但在这种情况下它确实有效果(增加静态intb
),因此无法对其进行优化。)这个后增量是完全无用的-因为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
的“旧”值。这确实很有用。我指的是第一行。