关于这个内联赋值的c规则是什么
本文关键字:规则 是什么 赋值 于这个 | 更新日期: 2023-09-27 18:25:37
我原以为结果是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
什么定义了这种行为?
我相信它的功能是这样的:
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
让我们看看释放模式下发射的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
这种代码令人困惑。尽量避免一切代价。