【发布时间】:2020-04-02 23:47:58
【问题描述】:
boolean expression 的示例是什么,如果短路,结果会有所不同
与完全评估布尔表达式相比,使用评估。然后我想知道如何根据三个地址来勾勒它
布尔表达式短路求值的中间代码?
【问题讨论】:
-
您的实际问题与语义分析或类型检查无关。
标签: compiler-construction code-generation boolean-expression
boolean expression 的示例是什么,如果短路,结果会有所不同
与完全评估布尔表达式相比,使用评估。然后我想知道如何根据三个地址来勾勒它
布尔表达式短路求值的中间代码?
【问题讨论】:
标签: compiler-construction code-generation boolean-expression
短路布尔值最常见的用途是确保不执行未定义的计算。换句话说,与短路相比,表达式的值的不同并不是因为表达式的值是明确定义的。
例如,考虑一个常见的 C 习语:
if ( ptr != NULL && *ptr == some_value ) { /* Do something */ }
在这种情况下,短路&& 可确保指针恰好是NULL 时不会被取消引用。通过全面评估,如果第一个条件为假,计算可能会做一些非常不受欢迎的事情(如段错误)。
由于短路评估的目的是有条件地不评估表达式的一部分,因此 TAC 实现需要在左侧表达式的评估之后包含条件分支语句。换句话说,上面的语句将以与等效语句非常相似的方式编译:
if ( ptr != NULL ) {
if ( *ptr == some_value ) {
/* Do something */
}
}
这可能会通过两个条件跳转来实现。
我不确定这与语义分析或类型检查有什么关系。
【讨论】: