这个内联赋值的c#规则是什么

这个内联赋值的c#规则是什么,c#,C#,我希望结果是0 值从5开始 值增加到10 合并检测到它高于5 它返回-10 由于检测到该值大于5,这意味着在本例中它的值为10,所以我期望值为10+=-10 所发生的是5+=-10 什么定义了这种行为?我相信它的功能是这样的: int value = 5; value += //5 is stored here for the calculation (value += 5) // 5 is modified to 10 > 5 ? -value //-10

我希望结果是0

  • 值从5开始
  • 值增加到10
  • 合并检测到它高于5
  • 它返回-10
  • 由于检测到该值大于5,这意味着在本例中它的值为10,所以我期望值为10+=-10

    所发生的是5+=-10


    什么定义了这种行为?

    我相信它的功能是这样的:

    int value = 5;
    value += //5 is stored here for the calculation
       (value += 5) // 5 is modified to 10
         > 5 
         ? -value //-10 
         : +value; //10
    
    所以你得到
    5-10=-5


    进一步阅读:

    我相信它的功能是这样的:

    int value = 5;
    value += //5 is stored here for the calculation
       (value += 5) // 5 is modified to 10
         > 5 
         ? -value //-10 
         : +value; //10
    
    所以你得到
    5-10=-5


    进一步阅读:

    让我们看看释放模式下发射的IL:

    Program.Main:
    IL_0000:  ldc.i4.5    // Load 5
    IL_0001:  stloc.0     // Store value
    IL_0002:  ldloc.0     // Load value
    IL_0003:  dup         // Create a duplicate of value (5)
    IL_0004:  ldc.i4.5    // Load 5
    IL_0005:  add         // Add 5 to variable. Now value == 10
    IL_0006:  dup         // Duplicate value.
    IL_0007:  stloc.0     // Store value (10)
    IL_0008:  ldc.i4.5    // Load 5
    IL_0009:  bgt.s       IL_000E // Check value (10) > 5. If true go to IL_000E
    IL_000B:  ldloc.0     // value
    IL_000C:  br.s        IL_0010
    IL_000E:  ldloc.0     // Load value (10)
    IL_000F:  neg         // Negate value (-10)
    IL_0010:  add         // -10 + 5 = -5
    IL_0011:  stloc.0     // Store -5 in value
    IL_0012:  ldloc.0     // value
    IL_0013:  call        System.Console.WriteLine // Print value
    IL_0018:  ret  
    

    这种代码令人困惑。不惜一切代价避免它。

    让我们看看释放模式下发射的IL:

    Program.Main:
    IL_0000:  ldc.i4.5    // Load 5
    IL_0001:  stloc.0     // Store value
    IL_0002:  ldloc.0     // Load value
    IL_0003:  dup         // Create a duplicate of value (5)
    IL_0004:  ldc.i4.5    // Load 5
    IL_0005:  add         // Add 5 to variable. Now value == 10
    IL_0006:  dup         // Duplicate value.
    IL_0007:  stloc.0     // Store value (10)
    IL_0008:  ldc.i4.5    // Load 5
    IL_0009:  bgt.s       IL_000E // Check value (10) > 5. If true go to IL_000E
    IL_000B:  ldloc.0     // value
    IL_000C:  br.s        IL_0010
    IL_000E:  ldloc.0     // Load value (10)
    IL_000F:  neg         // Negate value (-10)
    IL_0010:  add         // -10 + 5 = -5
    IL_0011:  stloc.0     // Store -5 in value
    IL_0012:  ldloc.0     // value
    IL_0013:  call        System.Console.WriteLine // Print value
    IL_0018:  ret  
    


    这种代码令人困惑。不惜一切代价避免它。

    你能解释一下为什么你认为它是0吗?在遵循代码之后,我得出了-5的结论,然后你的小提琴演示了这一点。我认为
    +=
    在运行添加到值中的表达式之前会获取该值的临时副本。@juharr确实如此-但我认为要使其完整,这个信息应该是个问题。如果你想与您的用户保持良好的工作关系,请不要编写这样的代码colleagues@TimSchmelter我试着当我得到一些奇怪的结果时,你能解释一下为什么你认为会是0吗?在遵循代码之后,我得出了-5的结论,然后你的小提琴演示了这一点。我认为
    +=
    在运行添加到值中的表达式之前会获取该值的临时副本。@juharr确实如此-但我认为要使其完整,这个信息应该是个问题。如果你想与您的用户保持良好的工作关系,请不要编写这样的代码colleagues@TimSchmelter我试着当我收到一些奇怪的结果评论时,你不应该像这样使用
    +=
    。但我的回答是出于学术目的。作为评论,你不应该像这样使用
    +=
    。但我的回答是出于学术目的。实际上,我自己正在看《国际法》,看到这个答案被接受,我停止了阐述我的答案……虽然《国际法》显示了发生了什么,但我认为问题是关于规则为什么。我认为可能混淆OP的是:
    value+=x
    被扩展为
    value=value+x
    ,并且
    +
    操作符的参数从左到右求值。因此很明显,在最后有
    value=5+(-10)
    @RenéVogt,它实际上被扩展到
    int temp=value;value=temp+x
    @RenéVogt,如果你认为你的答案可以添加信息,那就说吧,更多总是更好。实际上我自己正在看IL,看到这个答案被接受了,我停止制定我的答案……虽然IL显示了发生了什么,但我认为问题是关于规则为什么。我认为可能混淆OP的是:
    value+=x
    被扩展为
    value=value+x
    ,并且
    +
    操作符的参数从左到右求值。因此很明显,在最后有
    value=5+(-10)
    @RenéVogt,它实际上被扩展到
    int temp=value;value=temp+x
    @RenéVogt,如果你认为你的答案可以添加信息,那就继续吧,越多越好