C++短路评估

发布于 2024-12-27 12:02:05 字数 293 浏览 1 评论 0原文

也许我错过了一些相当简单的东西,但是当我取消引用指针时,即使我检查表达式最开头的点,我也会崩溃。

if( var1 &&
    bool1 || bool2 &&
    var1->DoSomething() )
{

}

var1 是一个空指针,但 Var1->Dosomething() 仍在被调用。我的理解是 &&和|| C++ 中的运算符是短路的,因此如果 var1 为 null,那么它就会从一开始就终止。还是我还缺少其他东西?

Maybe I am missing something rather simple, but I am getting a crash when I dereference a pointer even though I check the point at the very beginning of the expression.

if( var1 &&
    bool1 || bool2 &&
    var1->DoSomething() )
{

}

var1 is a null pointer, but Var1->Dosomething() is still being called. My understanding is that the && and the || operator in C++ are short circuit so if var1 was null then it would just terminate at the very beginning. Or is there something else I am missing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

独行侠 2025-01-03 12:02:05

运算符优先级是这里的关键。由于 && 的优先级高于 ||,因此您的表达式等效于

(var1 && bool1) || (bool2 && var1->DoSomething() )

So,因为 var1 的计算结果为 false,bool1 不会被计算,并且 (var1 && bool1) 产生 false,因此 (bool2 && var1->DoSomething()) 必须是评价。如果 bool2 恰好为 true,则 var1->DoSomething() 也将被求值,从而导致未定义的行为。

只需添加一些括号(针对您需要的特定表达式树)就可以了。

Operator precedence is the key here. Because && has higher precedence than ||, your expression is equivalent to

(var1 && bool1) || (bool2 && var1->DoSomething() )

So, since var1 evaluates to false, bool1 is not evaluated and (var1 && bool1) yields false, therefore (bool2 && var1->DoSomething()) has to be evaluated. And if bool2 happens to be true, then var1->DoSomething() will also be evaluated, resulting in undefined behavior.

Just add some parentheses (for the specific expression tree that you require) and you'll be fine.

一页 2025-01-03 12:02:05

由于 && 的优先级高于 ||,因此您的表达式将被解析为 (var1 && bool1) || (bool2 && var1->DoSomething())。现在,由于 var1 是空指针,短路求值意味着 bool1 不求值,并且 || 的左侧求值为 false 。因此,要找出表达式的值,必须对右侧进行求值(即短路求值不会在这里起作用!)。 || 的右侧是 bool2 && var1->DoSomething(),因此如果 bool2 为 true,则将评估 var1->DoSomething()。另请注意,即使 var1 非空,e表达式的结果也并不总是您可能期望的结果。

Since && has higher precedence than ||, your expression is parsed as (var1 && bool1) || (bool2 && var1->DoSomething()). Now since var1 is a null pointer, short circuit evaluation means that bool1 is not evaluated, and the left hand side of || evaluates as false. Thus to find out the value of the expression, the right hand side has to be evaluated (i.e. short-circuit evaluation does not kick in here!). The right hand side of || is bool2 && var1->DoSomething(), thus if bool2 is true, var1->DoSomething() will be evaluated. Note also that even for var1 non-null, the result of the eexpression will not always be what you probably expected.

乞讨 2025-01-03 12:02:05

简单的。
&&具有更高的优先级,因此您的表达式为:

if( ( var1 && bool1 ) || ( bool2 && var1->DoSomething()) )

尝试

if( var1 && ( bool1 || bool2 ) && var1->DoSomething() )

否则第一个表达式 car1 && bool1 失败,并计算第二个表达式。因为 bool2 返回 true 显然,如果 bool2 为 true,则指针将被取消引用。

在此处查找优先级列表: http://en.cppreference.com/w/cpp/language /operator_precedence 或使用谷歌。

Simple.
&& has higher precedence so your expression reads:

if( ( var1 && bool1 ) || ( bool2 && var1->DoSomething()) )

try

if( var1 && ( bool1 || bool2 ) && var1->DoSomething() )

otherwise the first expression car1 && bool1 fails and the second expression is evaluated. since bool2 returns true apparently your pointer is dereferenced if bool2 is true.

look here for a precedencelist: http://en.cppreference.com/w/cpp/language/operator_precedence or use google.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文