这是一个非常基本的问题,但我找不到明确的答案: 是否允许在同一个 if 语句中检查指针是否不为空并 (&&) 检查其成员值之一?
换句话来说:即使 f 为空,下面示例中的条件的正确部分是否仍被评估?
我知道这在 VS 当前版本中有效,但我需要知道的是 C++ 标准是否允许(或者 UB 是否允许)。 另外,如果我将其写为2个单独的if以使其更具可读性,我可以期望编译器将其优化为单个if吗?
struct foo
{
bool bar;
};
void main(){
foo *f;
// DO THINGS
if (f != null && f->bar == true)
{
// DO THINGS
}
}
编辑:问题与 this one 不同因为这只是一个顺序问题并不明显:证据是当我用谷歌搜索我的问题时,我并没有以这样的答案结束。
最佳答案
...is it allowed to check that a pointer is not null and (&&) to also check one of its members value in the same if statement?
It's perfectly valid, it is not UB ,表达式从左到右计算,如果表达式的左侧部分计算结果为 false,则不计算右侧部分。这通常称为运算符(operator)短路。
基本原理是,如果第一部分为 false
,则整个表达式不可能为 true
,false && false
为false
、false && true
也是 false
。
...if I write it as 2 separate if to make it more readable, can I expect the compiler to optimize it into a single if?
根据上述答案,您不需要两个 if
,我认为这不会使您的代码更具可读性,我更喜欢您正确知道的方式,在无论如何,这只是我的意见。关于编译器,我认为两种方式都不会有太大差异,如 live demo 中所示。 .
关于c++ - 在同一 if 语句中检查空指针 && 指针->成员值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67297793/