通过短路评估跳过条件的前/后增量

3Da*_*ave 2 c# compilation

所以,如果我有一个表达式:

if (obj != null && i++ % divisor == 0)
{
....
}
Run Code Online (Sandbox Code Playgroud)

objnull,那么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语句被短路时,行为类似于上述行为,并且后增量不排队.


Fis*_*rdo 6

绝对是设计.MSDN声明:

该操作x && y对应于操作,x & y除非如果x为假,则不评估y,因为无论y的值是什么,AND操作的结果都是假的.这被称为"短路"评估.

因此,您的陈述是什么并不重要,无论是否有后增量,如果它是短路的,它将不会被评估.