首页 > 解决方案 > 在同一 if 语句中检查空指针 && 指针-> 成员值

问题描述

这是一个非常基本的问题,但我找不到明确的答案:是否允许检查指针不为空,并且 (&&) 也可以在同一 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
   }
}

编辑:这个问题与这个问题不同,因为这只是一个顺序问题并不明显:证据是当我用谷歌搜索我的问题时,我并没有结束那个 SO 答案。

标签: c++language-lawyer

解决方案


...是否允许检查指针不为空,并且 (&&) 也可以在同一 if 语句中检查其成员值之一?

这是完全有效的,它不是 UB,表达式从左到右计算,如果表达式的左边部分计算到false右边部分则不计算。这通常称为操作员短路。

基本原理是,如果第一部分是false,那么整个表达式是不可能的truefalse && falsefalsefalse && true也是false

...如果我将其编写为 2 个单独的 if 以使其更具可读性,我可以期望编译器将其优化为单个 if 吗?

鉴于上述答案,您不需要两个ifs,我认为它不会使您的代码更具可读性,我更喜欢您正确知道的方式,无论如何这只是我的意见。关于编译器,我认为这两种方式都不会有太大差异,正如现场演示中所采样的那样。


推荐阅读