关于岗位增量

时间:2014-02-16 08:09:27

标签: c post-increment

   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++);我这样读过它“在我没有任何东西要分配之后,所以返回最后增加的值”(在此纠正我)

1 个答案:

答案 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给出)