gpt4 book ai didi

c - 关于岗位增量

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:14 25 4
gpt4 key购买 nike

   int get()
{
static i = 1;
return i++;
}

int main(int argc, char *argv[])
{
printf("%d %d %d\n", get(), get(), get());
return 0;
}

输出:3 2 1(顺序取决于编译器)

问题:但是为什么静态变量(文件作用域)返回的是增量前的值。后/前增量的经验法则是什么?我从来没有弄对过。请帮忙。

好吧,让我更具体一点,我读过的所有例子都是这样的,a = i++;或 a =++i; 这些是先递增然后赋值或先赋值然后递增的表达式。但是这些都是什么表达式呢,return i++; func(a++); 我这样读它“在 i++ 没有要分配的东西之后,所以返回最终的增量值”(在这里纠正我)

最佳答案

这里有两个问题,lifetime 和 scope。

变量的作用域就是可以看到变量名的地方。在这里,i 仅在函数 get() 中可见。

变量的生命周期是它存在的时间。如果定义 i 时没有关键字 static,则生命周期将从进入 get() 到从 get() 返回;所以它会在每次调用时重新初始化为 1。

关键字static的作用是将变量的生命周期延长到程序的生命周期;例如初始化只发生一次,然后变量保留它的值——无论它变成了什么——在以后所有对 get() 的调用中。

后增量和前增量的区别:What is the difference between pre-increment and post-increment in the cycle (for/while)?

资料来源:在 this 上回答地点

更新 1

后递增的工作原理是创建现有值的临时副本,然后递增原始值,最后将临时值作为表达式的结果返回。结果,增量似乎是在表达式后求值完成的,但实际上并非如此,如果有兴趣,演示这一点的示例程序相当简单。正是临时副本使 post-inc 变得昂贵。(感谢 WhozCraig 指正)

更新 2

这两个都是后增量一元运算。它们都制作了操作数的临时副本(第一种情况是 i,第二种情况是 a),然后递增操作数,然后将临时副本作为 post-inc 表达式的结果返回。第一种情况的结果是 i 递增,并返回递增前的值。在第二种情况下,a 递增,并使用递增之前的值调用 func。(由 WhozCraig 提供)

关于c - 关于岗位增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21808791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com