C 基于短路逻辑运算的条件执行

C 基于短路逻辑运算的条件执行,c,short-circuiting,C,Short Circuiting,由于逻辑运算符&&和| |的计算被定义为“短路”,我假设以下两段代码是等效的: p = c || do_something(); 及 给定的p和c是bool,而do\u something()是一个返回bool和可能有副作用的函数。根据C标准,可以依赖于代码片段是等价的假设吗?特别是,有了第一个代码片段,是否承诺如果c为真,函数将不会执行,并且不会产生任何副作用 是的,你的想法是正确的c | | | do| u something()将短路,因此永远不会调用do|u something() 但

由于逻辑运算符
&&
| |
的计算被定义为“短路”,我假设以下两段代码是等效的:

p = c || do_something();


给定的
p
c
bool
,而
do\u something()
是一个返回
bool
可能有副作用的函数。根据C标准,可以依赖于代码片段是等价的假设吗?特别是,有了第一个代码片段,是否承诺如果
c
为真,函数将不会执行,并且不会产生任何副作用

是的,你的想法是正确的<如果
c
true
,则code>c | | | do| u something()将短路,因此永远不会调用
do|u something()


但是,如果
c
false
,则将调用
do_something()
,其结果将是
p

的新值。经过一些搜索后,我将参考标准回答我的问题: 第6.5.14节逻辑或运算符说明:

与按位|运算符不同,| |运算符保证 从左到右评价;有一个序列点在 第一个操作数的求值。如果第一个操作数比较不相等 如果设置为0,则不计算第二个操作数

以及关于
和&
的类似部分。
所以答案是肯定的,代码可以被安全地认为是等效的。

看看短路就是这么回事。并且只有当操作在
bool
之间时,标准才能保证。当运算符重载时不会发生这种情况。@user3267581重载运算符是什么意思?你有C++吗?是的,抱歉,没有注意到问题是C特定的。我相信C++可以将过载的<代码> < <代码>也实现为短路。但这是另一个问题
if (c) {
   p = true;
}
else {
   p = do_something();
}