我正在玩我的 intcode 计算机实现(从代码 2019 的出现开始),发现当我实现开关(以选择要执行的操作)时,它采用了错误的值。
下面的代码演示了这一点。
InstructionPointer
有 的值2
,opcode
有 的值6
意味着OpcodeJumpIfFalse
将被使用。函数Jif()
被调用得很好,它返回一个值,在我的例子中它返回0
. Jif()
还修改了 的值InstructionPointer
,将其值更改为9
。会InstructionPointer
增加0
(返回值Jif()
),我希望它的值是9
,但它的值会回到原来的2
。
InstructionPointer += opcode switch
{
OpcodeAdd => Add(),
OpcodeMultiply => Mul(),
OpcodeInput => Inp(),
OpcodeOutput => Out(),
OpcodeJumpIfTrue => Jit(),
OpcodeJumpIfFalse => Jif(),
OpcodeLessThan => Let(),
OpcodeEquals => Equ(),
OpcodeAdjustRelativeBase => Arb(),
OpcodeHalt => End(),
_ => throw new ArgumentOutOfRangeException()
};
显示相同行为的最小示例:
int j = 2;
int i = 1;
int A()
{
j = 10;
return 0;
}
j += i switch
{
1 => A(),
_ => throw new Exception()
};
Console.WriteLine(j);
我确实注意到 Resharper(在最小的例子中)告诉我分配在A()
.
我的问题是,为什么会发生这种情况?j
是切换前“捕获”的值吗?这是预期的行为吗?
现在,我已将代码更改为使用临时变量,这解决了问题,但我仍然想知道这里发生了什么。