boolean expression
的例子是什么,如果发生短路,结果会有所不同与完全评估布尔表达式相比,使用评估。然后我想知道如何根据三个地址布尔表达式的短路评估的中间代码?
短路布尔值的最常见用法是确保不执行未定义的计算。换句话说,表达式的值并没有因为短路而有所不同,而是表达式的值定义得很好。
例如,考虑一个常见的C习惯用法:
if ( ptr != NULL && *ptr == some_value ) { /* Do something */ }
在这种情况下,短路&&
确保指针恰好是NULL
时不会取消引用指针。经过全面评估,如果第一个条件为假,则该计算可能会做某些确实不希望的事情(例如segfault)。
由于短路评估的目的是要有条件地不对表达式的一部分进行评估,因此TAC实现需要在评估左侧表达式后包括条件分支语句。换句话说,以上语句将以与等效语句非常相似的方式进行编译:
if ( ptr != NULL ) {
if ( *ptr == some_value ) {
/* Do something */
}
}
大概可以通过两个条件跳转来实现。
我不确定这与语义分析或类型检查有什么关系。