【问题标题】:Unary Prefix Increment ++ Operator Different Outputs [duplicate]一元前缀增量++运算符不同的输出[重复]
【发布时间】:2017-06-24 02:30:29
【问题描述】:

谁能解释一下为什么 C# ++ 运算符会根据分配的变量提供不同的输出。 https://msdn.microsoft.com/en-us/library/36x43w8w.aspx

 int x = 0;
 int y  = x++;
 Console.WriteLine($"x: {x}" );
 Console.WriteLine($"y: {y}" );

 /*Prints
  * x: 1
  * y: 0
  */

我的理解是y被设置为x,也就是(0)然后在y赋值之后; x 加 1;

int x = 0;
x  = x++;
Console.WriteLine($"x: {x}" );

/*Prints
 * x: 0
 */

为什么同样的逻辑在这里不适用? x 应设置为 x,即为 0,然后在赋值后将 x 增加 1 并打印 1 而不是 0

这个例子也一样

int x = 0;
        x  += x++;
        Console.WriteLine($"x: {x}" );
/*Prints
 * x: 0
 */

再举一个例子

int x = 0;
        x  += x++ + x++;
        Console.WriteLine($"x: {x}" );
        /*Prints
         * x: 1
         */

似乎在我不理解的背景中发生了一些不同的逻辑。

【问题讨论】:

  • 关于 ++ 运算符(前缀和后缀)如何在 C# 中工作的详细说明在这里:stackoverflow.com/a/3346729/1286670
  • @Steve 我不确定这是否是故意的,但您将 "Unary Prefix Increment ++ Operator" 更改为 "Unary Prefix Increment @987654337 @Operator" - 没有这样的事情
  • 我相信@Ňuf 找到的 Eric Lippert 的回答涵盖了这篇文章的所有问题。如果仍然缺少某些内容 - 请edit 发帖并澄清哪些部分需要单独解释。请确保在进行编辑时编写准确的分步推理 - 除了为 ++ 操作提供的 5 个 Eric 之外,您最多应该有几个额外的步骤来覆盖整个 x = x++ 语句。
  • @MickyD 是的,我的错。以为您在谈论从标题中删除语言标签,这通常是合适的。
  • @AlexeiLevenkov 这真的是stackoverflow.com/questions/3346450/… 的副本吗,因为这个问题与预增量无关?

标签: c# variables operators unary-operator prefix-operator


【解决方案1】:
int x = 0;
x  = x++;

第一次操作-存储x(0)的初始值,第二次操作-增加x(1),第三次操作-将存储的值分配给x(0)

int x = 0;
x  += x++;

在这种情况下,加法的第一个操作数在递增 (0) 之前“冻结”,第二个操作数也在递增 (0) 之前“冻结”。结果0 + 0 = 0

【讨论】:

    【解决方案2】:

    对于您要执行的操作,操作员的方法有误。

    根据文档:

    自增运算符可以出现在其操作数之前或之后:++变量和变量++

    第一种形式是前缀递增操作。运算的结果是操作数自增后的值。

    第二种形式是后缀递增操作。运算的结果是操作数在递增之前的值。

    所以在您的代码示例中,您将y 设置为x 之前 x 递增。如果您希望将y 设置为xnew 值,您需要使用前缀递增操作来递增x,并将结果作为您希望的新值:

    int x = 0;
    int y = ++x;
    Console.WriteLine($"x: {x}" );
    Console.WriteLine($"y: {y}" );
    /*Prints
      * x: 1
      * y: 1
    */
    

    【讨论】:

    • 我认为 OP 的意思是他将代码读取为 int x=0; x++; x += 0;,这将等于 1。
    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多