Visual Basic与FreeBasic中IIf实现存在差异的原因是什么?
为什么VB6/VBA中的
IIf(A, B, C)会同时计算B和C? 核心原因是:VB6/VBA里的IIf是标准VBA函数,而非语言内置的短路运算符。
在VB6/VBA的函数调用规则中,调用任意函数时,所有传入的参数表达式都会被预先求值,再把结果传递给函数。也就是说,不管条件A的结果是True还是False,B和C两个表达式都会被完整计算一遍,之后才进入IIf函数内部逻辑,根据A的值返回其中一个结果。
比如这段代码:
Dim x As Integer, y As Integer x = 0 y = IIf(x <> 0, 12 \ x, 0)
在VB6/VBA中执行时,会先计算x <> 0得到False,同时也会执行12 \ x的计算——此时x为0,直接触发除零异常,后续的函数逻辑根本没机会执行。
而像FreeBasic的IIf、VB.NET的If运算符,或是C/C++的?:三元运算符,都属于语言内置的短路求值运算符:它们会先判断条件A,仅计算符合条件的分支表达式(B或C),另一个分支不会被执行,从根源避免了不必要的计算或异常。
VB.NET推出的If运算符(需与IIf函数区分)就是为了修复这个设计问题,它支持短路求值,所以类似上述的除零场景不会抛出异常。
内容的提问来源于stack exchange,提问作者stanchcorder6
相关产品推荐
相关产品推荐

