gpt4 book ai didi

c# - == 运算符到底做了什么?

转载 作者:太空狗 更新时间:2023-10-29 23:21:25 24 4
gpt4 key购买 nike

所以我查看了 ILDASM,检查了一个如下所示的 .exe:

int a = 2;
Int32 b = 1;
if(b == 1)
{

}

现在,CIL 代码如下所示:

IL_0005:  ldloc.1
IL_0006: ldc.i4.1
IL_0007: ceq
IL_0009: ldc.i4.0
IL_000a: ceq
IL_000c: stloc.2

我知道首先加载 b(存储在 [1] 中),然后加载一个值为 1 的常量,然后比较它们。我不明白的是为什么在存储比较结果之前加载并比较另一个值为 0 的常量。
由于第一个比较应该已经产生了一个真值,检查这个值是否为 0 会反转结果,对吧?
我现在的问题是:为什么它是倒置的?我假设它与我使用的 == 运算符有关,我的理论是它返回差异。如果此差异为 0,则值相同,因此结果应为 true。但是0代表false,所以需要取反。
我似乎找不到关于这个主题的任何信息,只是关于 ==~ 之类的运算符的信息。希望你能赐教:)

最好的问候

威尔苏

PS:这是完整的代码:

.method private hidebysig instance void  Form1_Load(object sender,
class [mscorlib]
System.EventArgs e) cil managed
{
// Code size 19 (0x13)

.maxstack 2
.locals init ([0] int32 a,
[1] int32 b,
[2] bool CS$4$0000)
IL_0000: nop
IL_0001: ldc.i4.2
IL_0002: stloc.0
IL_0003: ldc.i4.1
IL_0004: stloc.1
IL_0005: ldloc.1
IL_0006: ldc.i4.1
IL_0007: ceq
IL_0009: ldc.i4.0
IL_000a: ceq
IL_000c: stloc.2
IL_000d: ldloc.2
IL_000e: brtrue.s IL_0012
IL_0010: nop
IL_0011: nop
IL_0012: ret
} // end of method Form1::Form1_Load

最佳答案

ceq 从堆栈中获取两个值,如果它们相等则返回 1,否则返回 0。但是,C# 中的 == 是否会导致 ceq 取决于很多因素:

  • 数据类型
    • 它们是原始动物吗?
    • 他们有自定义的 == 运算符吗?
    • 它们是引用资料吗?
  • 上下文
    • 它可以针对其他东西进行优化吗? (我在类似的例子中得到一个 bne.un.s;还有 beq*br*switch等)
    • 可以完全删除吗?

关于c# - == 运算符到底做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33689284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com