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(顺序取决于编译器)
问题:但为什么静态变量(文件范围)返回增量前的值。 post / pre increment的拇指规则是什么?我从来没有弄错。请帮忙。
好吧,让我更具体一点,我读到的所有例子都是,a = i++; or a = ++i;
这些是递增然后赋值或赋值然后递增的表达式。但是这些表达式是什么,return i++; func(a++);
我这样读过它“在我没有任何东西要分配之后,所以返回最后增加的值”(在此纠正我)
答案 0 :(得分:0)
这里有两个问题,生命和范围。
变量的范围是可以看到变量名称的位置。在这里,我只在函数get()中可见。
变量的生命周期是它存在的时间段。如果在没有关键字static的情况下定义了i,那么生命周期将从get()的入口到get()的返回;因此,每次通话都会重新初始化为1。
关键字static用于将变量的生命周期延长到程序的生命周期;例如初始化只发生一次,然后变量保留其值 - 无论它是什么 - 将来所有调用get()。
帖子和预增量之间的差异:What is the difference between pre-increment and post-increment in the cycle (for/while)?
来源:this地点的答案
更新1
通过制作现有值的临时副本,然后递增原始值,然后最终返回表达式的结果,后增量工作。结果,似乎增量是在表达后评估中完成的,但事实并非如此,并且如果感兴趣的话,展示这一点的示例程序是相当直接的。正是临时副本使后期公司变得昂贵。 (感谢WhozCraig的纠正)
更新2
这两个都是增量后的一元操作。它们都是操作数的临时副本(i在第一种情况下,在第二种情况下为a),然后递增操作数,然后返回临时副本作为post-inc表达式的结果。在第一种情况下的结果是i递增并且返回其在递增之前的值。在第二种情况下,a递增,并使用增量之前的值调用func。(由WhozCraig给出)