当前位置:  开发笔记 > 编程语言 > 正文

关于此内联赋值的c#规则是什么

如何解决《关于此内联赋值的c#规则是什么》经验,为你挑选了2个好方法。

我期待结果是0

dotnetfiddler演示

using System;

public class Program
{
    public static void Main()
    {
        int value = 5;
        value += (value += 5) > 5 ? -value : +value;

        Console.WriteLine(value);
    }
}

    价值从5开始

    价值增加到10

    合并检测到它高于5

    它返回-10

因为检测到的值高于5,这意味着在这种情况下它的值为10,我期待10 + = -10

发生的事情是5 + = -10

什么定义了这种行为?



1> DLeh..:

我相信它的功能如下:

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

进一步阅读:MSDN



2> Yuval Itzcha..:

让我们看一下发布模式下发出的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  

这种代码令人困惑.尽量避免使用它.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有