代码之家  ›  专栏  ›  技术社区  ›  Andriy Volkov

为什么我不能用C语言做++I++?

  •  27
  • Andriy Volkov  · 技术社区  · 15 年前

    半开玩笑半认真 : 为什么我不能 ++i++ 在C语言中,特别是在C语言中。

    我希望它增加值,在我的表达式中使用它,然后再次增加。

    7 回复  |  直到 11 年前
        1
  •  57
  •   Simon Nickerson    15 年前

    简短回答: i++ 不是“左值”,因此不能作为赋值的主题。

        2
  •  84
  •   Timwi    14 年前

    虽然简短的回答“它不是左值”是 对的 或许这只是个问题。 为什么? 这不是一个 左值 ?或者,正如我们在c中所说,a 变量 .

    原因是因为 你不能再吃蛋糕了 . 逻辑地计算出来:

    首先,C中的+运算符的含义,无论是后缀还是前缀,都是 获取该变量的值,增加该值,将新值赋给该变量,并生成一个值。 . 结果生成的值要么是原始值,要么是递增值,这取决于它是后缀还是前缀。但不管怎样,你都会产生一个价值。

    第二, 变量的值始终是该变量的当前内容 . (模拟一些奇怪的线程场景,这些场景会带我们走得很远。)

    我希望你同意这些是完全合理的规则。

    现在应该很清楚为什么I++的结果不能是变量,但如果不是,让我澄清一下:

    假设我10岁。i++的意思应该是“获取i_10_的值”增加它_11_存储它_“我现在是11_”,并给出结果__10的原始值。所以当你说打印(i++)时,它应该打印10,11应该存储在i中。

    现在假设i++的含义是返回 变量 而不是 价值 .你说打印(I++)会发生什么?你得到i_10_的值,增加它_11__,存储它__,我现在是11__),然后返回变量。变量的当前值是多少?11岁!这正是你不想打印的。

    简而言之,如果i++返回一个变量,那么它将执行以下操作 恰恰相反 具有操作员的预期含义!你的建议在逻辑上是不一致的,这就是为什么没有语言这样做的原因。

        3
  •  18
  •   vehomzzz    15 年前

    因为你关心下一个程序员维护(或试图重写)你的代码,在你因违反流行惯例而被解雇很久之后。

        4
  •  8
  •   sambowry    15 年前

    我测试了(++i,i++)作为解决方法:

    #include <stdio.h> 
    
    int main(){
      int i=0;
    
      printf(" i:         %i\n", i         );
      printf(" (++i,i++): %i\n", (++i,i++) );
      printf(" i:         %i\n", i         );
    }
    

    结果:

    
    i:         0
    (++i,i++): 1
    i:         2
    
        5
  •  6
  •   Stephen Canon    15 年前

    因为结果 i++ 不是左值。

        6
  •  3
  •   nall    15 年前

    我认为递增(或递减)运算符需要赋值给左值。然而,++i不是左值,它是一个表达式。精通编译器的人可能能够澄清这种约束是否有技术原因。

        7
  •  3
  •   John Rasch    15 年前

    从第7.5.9节 C# 3.0 specification :

    后缀增量的操作数或 减量操作必须是 分类为变量的表达式,a 属性访问或索引器访问。 操作的结果是一个值 与操作数类型相同。如果 后缀增量的操作数或 减量操作是一个属性或 索引器访问、属性或 索引器必须同时具有get和set 访问器。如果不是这样的话, 发生编译时错误。

    另外,后增量表达式( i++ )将首先进行评估,因为它比预增量具有更高的优先级( ++i 运算符。