37、算术与逻辑表达式中的求值顺序、副作用及短路求值

算术与逻辑表达式中的求值顺序、副作用及短路求值

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. 副作用与序列点

大多数语言保证在程序执行的某些特定点(即序列点)之前完成副作用的计算。例如,几

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值