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();
}