c++, evaluating expressions with multiple `&&`s and no operator of lower precedence

白昼怎懂夜的黑 提交于 2019-12-13 16:18:37

问题


If an expression evaluates multiple && operators, and does not evaluate any operators of lower precedence (eg. ||, ?:), will the expression evaluate to 0 as soon as one of the &&s return 0, or will it finish evaluating the remaining &&s?

For example,

q=0; w=1; e=1; r=1;
if(q && w && r && e) {}

Will this if() evaluate to false as soon as q && w evaluates to 0 (since the remaining && must all evaluate to 0 regardless of the right hand operators)?


回答1:


Yes, evaluation will terminate early ("short circuit") as soon as a false expression is encountered. There is one exception to this: if the && operator has been overloaded for the relevant types of arguments. This is strongly discouraged and extremely rare, but could happen.




回答2:


Yes, it does do short-circuit evaluation, for built-in types. Custom types where you've overloaded && or || won't have short-circuiting performed, which can cause subtle bugs.




回答3:


Others have already stated the answer (i.e. "yes").

I will answer to add an example of one particularly idiomatic usage of this:

if ((p != NULL) && (*p == 42))
{
    /* Do something */
}

This would have to be written in a much clumsier manner if short-circuiting didn't happen.

Note that you can also use this in a Perl-esque manner, e.g.:

someCondition && doSomething();

so doSomething() only gets called if someCondition is true. But this only compiles if doSomething() returns a type that can be converted to bool, and it's not considered idiomatic C++. (Note also that this technique doesn't compile in C.)



来源:https://stackoverflow.com/questions/7196013/c-evaluating-expressions-with-multiple-s-and-no-operator-of-lower-precede

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!