c++ - 在同一 if 语句中检查空指针 && 指针->成员值

标签 c++ language-lawyer

这是一个非常基本的问题,但我找不到明确的答案: 是否允许在同一个 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,则整个表达式不可能为 truefalse && falsefalsefalse && 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/

相关文章:

c++ - 这段代码是否颠覆了 C++ 类型系统?

模板显式特化的 C++ 措辞

c++ - 使用 __float128 编译 C++ 代码

c++ - `std::function` 和之前推导的模板参数的替换失败 - 为什么?

c++ - "potentially-evaluated"是否与 C++03 中的 "odr-used"相同?

c++ - C++ 标准到底在哪里说取消引用未初始化的指针是未定义的行为?

c++ - 为什么我不能递减 std::array::end()?

c++ - N 个区间的 bool 规则 (C)

c++ - 为什么非静态变量不能驻留在头文件中?

c++ - Qt:为模板构造一个可变迭代器(映射、列表、集合……)