【问题标题】:Chain Increment Operators链增量运算符
【发布时间】:2015-03-04 16:19:19
【问题描述】:

为什么不能链接运算符?

int test = 5;
test++++;

int test = 5;
++test++;

此代码给出编译时错误。

递增或递减运算符的操作数必须是变量、属性或索引器。

我完全理解,如果允许,这将是一种完整的代码味道,几乎没有实际用途。我不完全理解为什么这会导致错误。我几乎希望test 在每个语句之后的值是 7。

【问题讨论】:

  • 你的意思是你不明白规范的哪一部分禁止它,或者为什么它是这样设计的?
  • 是否有任何语言允许这样做?
  • @JonSkeet:为什么要这样设计?
  • @JonSkeet 我猜两者都有。我实际上可以看到的唯一用法是在 for 循环中替换 i = i + 2
  • @Habib:是的,C++ 可以(不过,只有前缀版本,最多一个后增量)。参见例如rextester.com/OVXB28335

标签: c# operators


【解决方案1】:

基本上,这是由于规范的第 7.6.9 节:

后缀递增或递减操作的操作数必须是分类为变量、属性访问或索引器访问的表达式。运算的结果是一个与操作数相同类型的值。

第二句意味着i++ 被归类为一个(不是变量,不像i),第一句阻止它成为运算符的操作数。

我怀疑它是为了简单而设计的,以避免你真的不想进入的奇怪情况 - 不仅仅是你给出的代码,还有类似的东西:

Foo(ref i++);
i++ = 10;

【讨论】:

    【解决方案2】:

    ++ 运算符作用于“左手值”,即可以赋值的东西,因为它相当于:

    test = test + 1;
    

    另一方面,test++ 是一个表达式,你不能给它赋值,test++ = 5 不起作用。

    这就是(test++) ++不起作用的原因。

    【讨论】:

      【解决方案3】:

      ++ 是一个特殊的运算符,它只是 foo = foo + 1 的简写。当你可以说 foo = foo 时,创建一个无限的重载列表(如 +++、++++ 等)是没有意义的+ 7,这是必须要做的。

      • 本身就是一个连接 2 个值的运算符。如果语言设计者试图像你建议的那样将 pull 双重职责作为一种特殊的语法,那将对编译器造成额外的负担,并可能导致一些令人困惑的代码。

      所以基本上简短的回答是不值得努力。没有它并不难,尤其是使用 += 运算符。而且它更具可读性。什么更容易阅读:

      int test = 1;
      test+++++;
      

      或者....

      int test = 1;
      test += 5;
      

      计算所有这些加号将是一种痛苦。 2一目了然。不仅如此,您还将在 50-50 的抽奖中数数果冻豆。 :-)

      【讨论】:

      • 我认为 OP 意味着像 (i++)++ 一样第二次应用 ++ 运算符,而不是为什么该语言没有 +++++++ 运算符。
      猜你喜欢
      • 2014-03-03
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2012-11-23
      • 1970-01-01
      相关资源
      最近更新 更多