代码之家  ›  专栏  ›  技术社区  ›  codey modey

关于岗位增量

  •  1
  • codey modey  · 技术社区  · 12 年前
       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(顺序取决于编译器)

    问题:但是为什么静态变量(文件范围)返回的值在increment之前。后/前增量的经验法则是什么?我从来没有把它弄对。请帮忙。

    好吧,让我更具体一点,我读到的所有例子都是这样的, a = i++; or a = ++i; 这些是先递增再赋值或先赋值再递增的表达式。但是这些是什么样的表达, return i++; func(a++); 我是这样读的:“在I++之后,没有要赋值的内容,所以返回最后的递增值”(在这里纠正我)

    1 回复  |  直到 12 年前
        1
  •  0
  •   Community Mohan Dere    9 年前

    这里有两个问题,生存期和范围。

    变量的范围是可以看到变量名称的地方。这里,i仅在函数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

    后增量的工作原理是先创建现有值的临时副本,然后递增原始值,最后作为表达式的结果返回临时值。因此,看起来增量是在表达式求值后完成的,但实际上不是,如果有兴趣的话,一个示例程序可以直接演示这一点。正是临时拷贝让post-inc变得昂贵。 (感谢WhozCraig的纠正)

    更新2

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