【问题标题】:Why Don't "a=a++" Operation Increase The Value "a" [duplicate]为什么“a=a++”操作不增加“a”的值[重复]
【发布时间】:2013-01-05 20:15:06
【问题描述】:

可能重复:
If i == 0, why is (i += i++) == 0 in C#?

我知道这不是一个逻辑实现,我知道我应该使用前缀 ++,但我对这段代码很好奇:

int a = 1;
a = a++;
Console.Write(a);

我希望结果是 2,但事实并非如此。为什么结果是 1? 在a 均衡为a 后,a 的值增加。但似乎++操作在另一个维度执行:)

【问题讨论】:

  • 这类问题会问多少个版本?

标签: c#


【解决方案1】:

++放在之后a告诉它返回值,然后递增。同时,递增发生在赋值之前,所以你失去了旧值。这是等效的代码:

int a = 1;
int temp_old_a = a; //temp_old_a is 1
a = temp_old_a + 1; //increments a to 2, this assignment is from the ++
a = temp_old_a; //assigns the old 1 value thus overwriting, this is from your line's assignment `a =` operator
Console.Write(a); //1

所以你可以看到它最终是如何丢弃增加的值的。另一方面,如果你把++ 之前 a:

int a = 1;
a = ++a;
Console.Write(a); //2

它的作用类似于:

int a = 1;
int temp_old_a = a;
temp_old_a = temp_old_a + 1;
a = temp_old_a; //assigns the incremented value from the ++
a = temp_old_a; //assigns again as per your original line's assignment operator `a =`
Console.Write(a); //2

在这种情况下,当变量作为表达式的一部分递增时,重新分配变量通常没有意义。你几乎总是简单地增加它会更好:

int a = 1;
a++; //or ++a, but I find a++ is more typical
Console.Write(a); //2

看到这样的代码通常更标准,而且更容易混淆(正如您所发现的那样)。

【讨论】:

  • 感谢您的详细解释。我只是好奇。
【解决方案2】:

a++ 是一个后增量,这就是它的工作方式。它的行为好像 增加变量 返回它的值。实际上它会增加它的值,然后返回之前的值。

另一方面,

++apre-increment,它将按照您的意愿行事。

【讨论】:

    【解决方案3】:

    因为a++ 是后增量 - 首先返回值然后增加它。在这种情况下,您应该只使用

    int a=1;
    a++;
    Console.Write(a);
    

    int a = 1;
    a = ++a;
    Console.Write(a);
    

    ++a 是预增量 - 先增加值,然后返回增加值。

    【讨论】:

      【解决方案4】:

      注意:某些语言接受以下语法:

      a = ++a
      

      这将按照您的建议工作,首先增加一个,然后返回它:)

      【讨论】:

        【解决方案5】:

        因为用作后缀的 ++ 操作数仅在变量的值被使用后才会递增。 如果使用 ++ 操作数作为前缀,则变量会在使用其值之前递增。

        例如:

        案例一:后缀使用

        int a = 1;

        int b;

        b = a++;

        案例2:前缀用法

        int a = 1;

        int b;

        b = ++a;

        在“case 1”中,b 变量将被赋值为 1,而在“case 2”中,b 变量将被赋值为 2。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-01
          • 2019-10-27
          • 2017-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-06
          相关资源
          最近更新 更多