所以,如果我有一个表达式:
if (obj != null && i++ % divisor == 0)
{
....
}
Run Code Online (Sandbox Code Playgroud)
和obj是null,那么i是永远不会增加.如果我使用
i++;
if (obj != null && i % divisor == 0)
{
....
}
Run Code Online (Sandbox Code Playgroud)
相反,当然,i增加了.
这是设计的吗?我从优化的角度理解短路评估,但我(错误地)假设编译器会识别后增量表达式并对其进行评估.
(如果这是在规范中,我找不到它 - 只是在这里寻找一些(喘气)意见.)
更新
这是实际的代码.
private int _frameNumber = 0;
private void simulator_OnFrameEnd(object sender, System.EventArgs e)
{
_frameNumber++;
if (_visualizer != null && _frameNumber % _config.VisualizerUpdateFrequency == 0)
{
var field = _simulator.GetField(_config.PreviewField);
_visualizer.Update(field, _simulator.FrameTime);
}
if (_frameNumber % _config.OptimizerRegridFrequency == 0)
{
_simulator.UpdateFieldGrids();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
后增量仅是对陈述的后评估.由于该语句从未被评估(它被短路),所以它被跳过了.
想一想的更直观的方法是将if语句想象为嵌套:
if (obj != null)
{
if (i++ % divisor == 0)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我们立即看到i不会增加.类似地,当if语句被短路时,行为类似于上述行为,并且后增量不排队.