【问题标题】:Pre and post increment/decrement operators in C#C# 中的前后递增/递减运算符
【发布时间】:2008-10-06 12:59:55
【问题描述】:

在 C# 中,有谁知道为什么会编译以下代码:

int i = 1;
++i;
i++;

但这不会编译?

int i = 1;
++i++;

(编译器错误:递增或递减运算符的操作数必须是变量、属性或索引器。)

【问题讨论】:

  • 这是一个合法的问题,为什么要为此而失望?

标签: c#


【解决方案1】:

您正在对另一个操作数的结果运行其中一个操作数,增量/减量的结果是一个值 - 您不能对一个值使用增量/减量,它必须是一个可以设置的变量。

【讨论】:

    【解决方案2】:

    出于同样的原因,你不能说

    5++;
    

    f(i)++;
    

    一个函数返回一个,而不是一个变量。增量运算符也返回值,但不能应用于值。

    【讨论】:

      【解决方案3】:

      我的猜测是 ++i 返回一个整数值类型,然后您尝试对其应用 ++ 运算符。鉴于您无法写入值类型(想想 0++,如果这有意义),编译器将发出错误。

      换句话说,这些语句被解析为这个序列:

      ++i  (i = 2, returns 2)
      2++  (nothing can happen here, because you can't write a value back into '2')
      

      【讨论】:

        【解决方案4】:

        我的猜测:避免这种丑陋和不必要的结构。它还将使用 2 个操作 (2x INC) 而不是一个 (1x ADD 2)。

        是的,我知道……“但我想增加 2,我是 l33t g33k!”

        好吧,不要成为一个极客,写一些看起来不像是无意错误的东西,像这样:

        i += 2;
        

        【讨论】:

        • 你不觉得这有点苛刻吗?他只是在问为什么它不能编译——一个关于编译器设计的问题,而不是关于代码风格的问题。
        • 这太苛刻了。我发现这个问题是相关且有用的。
        猜你喜欢
        • 2011-07-21
        • 1970-01-01
        • 2015-10-03
        • 2011-02-16
        • 2013-11-16
        • 2011-08-29
        • 1970-01-01
        相关资源
        最近更新 更多