【问题标题】:Incrementing and decreasing i is not working properly递增和递减 i 无法正常工作
【发布时间】:2013-10-07 09:59:54
【问题描述】:

以下两行代码没有返回相同的值。有什么理由吗?

int i;

i = 1;
i = i + i++; //Returns 2, expecting 3

i = 1;
i = i++ + i; //Returns 3

从语义上讲,这应该是相同的a + b = b + a 对吧?

同样减少i:

i = 1;
i = i - i--; //Returns 0, expecting 1

i = 1;
i = i-- - i; //Returns 1, expecting -1

更让我困惑的是后自增运算符的用法:

i = 1;
i = i + ++i; //Returns 3

i = 1;
i = ++i + i; //Returns 4, expecting 3

减号运算符也一样:

i = 1;
i = i - --i; //Returns 1

i = 1;
i = --i - i; //Returns 0, expecting -1

最后一个问题:

编译器如何解释这两行?

i = i+++i; // is it i + ++i or i++ + i?
i = i---i; // is it i - --i or i-- - i?

【问题讨论】:

标签: c# operators increment decrement


【解决方案1】:
i = i + i++; //Returns 2, expecting 3

称为后增量。值将首先使用,然后递增。相当于

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

这是预增量。值会先递增再使用。

i = i++ + i; //Returns 3

等价于

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

i = i+++i; // 是 i + ++i 还是 i++ + i?

被解释为

i = i + 1; 我 = 我 + 我;

还有这个

i = i---i; // 是 i - --i 还是 i-- - i?

被解释为

i= i-1;
i = i-i; 

【讨论】:

    【解决方案2】:

    前增量 (++i) 和后增量 (i++) 之间存在差异。区别在于:

    预增量将在使用结果之前添加值。后增量将使用 reslt.. 然后添加该值。所以,你的第一个例子:

    int i;
    
    i = 1;
    i = i + i++; // First use equals 1, second use equals one. After this line though
                 // i equals 2, because of your use of post-increment.
    

    同样,你的第二个例子:

    i = 1;
    i = i++ + i; // First use is 1. After the first use.. it is incremented..
                 // The second use it is 2. Therefore, 1 + 2 == 3.
    

    至于你的最后一个问题……为什么不把它放到控制台应用程序中自己尝试一下呢?

    【讨论】:

      【解决方案3】:

      我认为尝试理解这一点的最佳方法是查看编译器对此的理解。

      请参阅此处以了解此案例的概述

      x=i-- - --i;
      

      https://stackoverflow.com/a/8573429/959028

      最好的问候

      【讨论】:

        【解决方案4】:

        递增或递减运算符的优先级始终高于 + - * / 等算术运算符
        请参阅http://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx 了解详细信息。 此外,后置递增或递减运算符的值仅在当前语句之后才有效。 例如:

        i = i + i++ = 1 + 1++ = 1 + 1 = 2; // value of i is effective after increament is done
        i = i++ + i = 1++ + 2 = 3; //Next value of i contains updated value i.e. 2
        i = i + ++i = 1 + ++1 = 1 + 2 = 3; //Next value of i contains updated value i.e. 2
        i = ++i + i = ++1 + i = 2 + 2; //Both value of i contains updated value i.e. 2 because of prefixed operator
        i = i+++i = i++ + i;
        i = i---i = i-- - i;
        

        【讨论】:

          猜你喜欢
          • 2020-10-08
          • 2016-06-16
          • 2022-07-20
          • 1970-01-01
          • 2022-01-19
          • 2014-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多