ANSI标准mandate是否允许在C或C++中缩短逻辑运算符?

我很困惑,因为我想起了K&R book说你的代码不应该依赖于这些操作被短路,因为它们可能不会.有人能指出标准中说逻辑运算总是短路的地方吗?我最感兴趣的是C++,C的答案也很棒.

我还记得我读到(记不清在哪里)没有严格定义求值顺序,因此您的代码不应该依赖于或假设表达式中的函数将以特定的顺序执行:在语句结束时,所有引用的函数都将被调用,但是编译器可以自由 Select 最有效的顺序.

标准是否指明了该表达式的求值顺序?

if( functionA() && functionB() && functionC() ) cout<<"Hello world";

推荐答案

是的,对于C和C++标准中的操作员||&&都需要短路和判断顺序.

C++标准说(C标准中应该有一个等价的子句):

1.9.18

In the evaluation of the following expressions

a && b
a || b
a ? b : c
a , b

using the built-in meaning of the operators in these expressions, 100 (12).

在C++中有一个额外的trap :短路确实NOT适用于重载操作符||&&的类型.

Footnote 12: The operators indicated in this paragraph are the built-in operators, as described in clause 5. When one of these operators is overloaded (clause 13) in a valid context, thus designating a user-defined operator function, the expression designates a function invocation, and the operands form an argument list, without an implied sequence point between them.

通常不建议在C++中重载这些运算符,除非您有非常特定的要求.您可以这样做,但它可能会 destruct 其他人代码中的预期行为,尤其是如果这些运算符是通过使用重载这些运算符的类型实例化模板间接使用的.

C++相关问答推荐

在C中,entry = fgets(entry,sizeof(entry),*pt)是否是错误?

int_leastX_t与intX_t不同吗?

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

使用单个字节内的位字段

Ebpf内核代码:permission denied:invalid access to map value

如何正确地索引C中的 struct 指针数组?

正在try 将文件/文件夹名从目录 struct 存储到链接列表

将 struct 变量赋给自身(通过指针取消引用)是否定义了行为?

#If指令中未定义宏?

在C++中通过空指针隐式访问常量变量的值

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

如何将另一个数组添加到集合中,特别是字符串?

使用nmake for程序比Hello World稍微复杂一些

在C++中允许使用字符作为宏参数

覆盖读取函数,但当文件描述符为3或4时,我有问题

为什么这个分配做得不好呢?

当我用scanf(&Q;%S%S%S&Q;,单词0,单词1,单词2)输入多个单词时,除了最后一个单词外,每个单词的第一个字符都丢失了

try 查找带有指针的数组的最小值和最大值

意外的C并集结果

变量值不正确的问题