算术与逻辑表达式中的求值顺序、副作用及短路求值
1. 表达式求值顺序的不确定性
在编程中,编译器对于表达式的求值顺序具有一定的自由度。例如,对于包含函数调用和子表达式的语句,编译器可以先调用函数,也可以先计算子表达式。以一个简单的情况为例,假设有一个函数 incN() 和表达式 n * 2 ,编译器可以先调用 incN() 函数(使得 n 在执行子表达式 n * 2 之前变为 3),也可以先计算 n * 2 再调用 incN() 函数。这就导致了同一语句在不同编译情况下可能产生不同的输出结果,一次编译可能输出 8,另一次编译可能输出 6。
不能通过实验来确定求值顺序,因为不同的编译器可能采用不同的求值顺序,甚至同一编译器在不同的上下文环境中也可能对同一子表达式采用不同的求值顺序。如果依赖特定编译器的求值顺序,当编译器更新版本时,求值顺序可能会改变,从而导致程序出现问题。
如果必须控制求值顺序,可以将复杂的表达式拆分成一系列简单的语句。例如,对于语句 i := f(x) + g(x); ,可以改写为:
temp1 := f(x);
temp2 := g(x);
i := temp1 + temp2;
2. 副作用与序列点
大多数语言保证在程序执行的某些特定点(即序列点)之前完成副作用的计算。例如,几
超级会员免费看
订阅专栏 解锁全文

745

被折叠的 条评论
为什么被折叠?



