首页 > 解决方案 > 短路评估是 C/C++ 或编译器实现中的语言特性吗

问题描述

我想知道是否短路评估

long param = 0;
if ( functAWithSideEffects(&param) || funcBWithSideEffects(&param) )

可以依靠。例如,如果 funcAWithSideEffects 返回 true,编译器会评估 funcBWithSideEffects 吗?短路评估是语言特性还是编译器实现细节?

标签: gccvisual-c++g++

解决方案


是的。它可以依靠。

C标准保证它(强调我的):

4 不同于按位 | 运算符,|| 运算符保证从左到右的评估;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较不等于 0,则不计算第二个操作数。

虽然 C++ 在几个方面与 C 不同,但我 99.99% 确信短路评估不是其中之一。

可以找到类似的保证&&


推荐阅读