gpt4 book ai didi

c# - 带后缀增量的三元运算符赋值

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:12 31 4
gpt4 key购买 nike

这有效,k 递增:

k = 0;
k = ( false condition here ) ? 0 : k+=1;

这有效,k 递增:

k = 0;
k = ( false condition here ) ? 0 : ++k;

这行不通,k 始终为 0:

k = 0;
k = ( false condition here ) ? 0 : k++;

谁能解释一下幕后发生的事情?

编辑:我不需要其他方式来写这个。我不在乎这是否可以用更简单的方式编写。

在 for 循环中,i++ 或++i 都有效。为什么这里的行为不同?

最佳答案

如果您想知道幕后发生了什么,我们可以查看 IL 级别。在此之前,我认为值得看看 xanatos 建议的++ 运算符的使用。

无论如何,让我们看一下为第二种情况生成的 IL。请看右边的评论:

int k = 0; 
k = false ? 0 : ++k;

IL_0001: ldc.i4.0 // Allocate space for int k
IL_0002: stloc.0 // assign 0 to k
IL_0003: ldloc.0 // load k on top of the evaluation stack --> our stack is [k]
IL_0004: ldc.i4.1 // load value 1 at location 1 for variable k --> [k 1]
IL_0005: add // Pops and add the top two values on the evaluation stack, and push the result onto the stack. our stack is --> [1]
IL_0006: dup // Copies the current topmost value on the evaluation stack, and then pushes the copy onto the evaluation stack. which in our case is 1 --> [1 1]
IL_0007: stloc.0 // Pop the top value on the stack at location 0 (e.g. assign it to k) --> [1]
IL_0008: stloc.0 // same again, the stack is empty now --> []
IL_0009: ret

可以看到最后两个STLoc.0把栈中的两个1赋值给了k。事实上,如果你仔细想想,我们有两个任务。一个用于++k ,另一个用于分配三元运算的结果。正如你所说,这会产生 1。让我们看看你最后一个产生 0 的情况:

int k = 0; 
k = false ? 0 : k++;

IL_0001: ldc.i4.0 // Allocate space for int k
IL_0002: stloc.0 // assign 0 to k
IL_0003: ldloc.0 // load k on top of the evaluation stack --> our stack is [k]
IL_0004: dup // Copies the current topmost value on the evaluation stack, and then pushes the copy onto the evaluation stack. which in our case is 1 --> [k k] in this case k is still 0!
IL_0005: ldc.i4.1 // load value 1 at location 1 for variable k --> [k k 1]
IL_0006: add // Pops and add the top two values on the evaluation stack, and push the result onto the stack. our stack is --> [k 1] // because k+1 is equal 1
IL_0007: stloc.0 // Pop the top value on the stack at location 0 (e.g. assign it to k) --> [1]
IL_0008: stloc.0 // Pop the top value on the stack at location 0 (e.g. assign it to k) but in this case k is still zero!!!!! --> []

正如您通过 IL 中的注释看到的那样,两条 STLoc.0 指令最终将 k 的原始值(即 0)分配给 k 本身。这就是为什么在这种情况下您得到 0 而不是 1 的原因。

我没有给出您问题的解决方案,而只是解释了在 MSIL 中的以下级别如何处理这些“简单”操作。

希望对您有所帮助。

关于c# - 带后缀增量的三元运算符赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29167705/

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