c++ - 在同一 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 答案。
解决方案
...是否允许检查指针不为空,并且 (&&) 也可以在同一 if 语句中检查其成员值之一?
这是完全有效的,它不是 UB,表达式从左到右计算,如果表达式的左边部分计算到false
右边部分则不计算。这通常称为操作员短路。
基本原理是,如果第一部分是false
,那么整个表达式是不可能的true
,false && false
是false
,false && true
也是false
。
...如果我将其编写为 2 个单独的 if 以使其更具可读性,我可以期望编译器将其优化为单个 if 吗?
鉴于上述答案,您不需要两个if
s,我认为它不会使您的代码更具可读性,我更喜欢您正确知道的方式,无论如何这只是我的意见。关于编译器,我认为这两种方式都不会有太大差异,正如现场演示中所采样的那样。
推荐阅读
- java - CORS 正在阻止 PUT、DELETE 和 POST 请求,但 GET 正在工作
- python - Django 将 id 从一个模型传递到另一个模型的外键
- azure-ad-b2c - 登录后 Azure AD B2C 个性化内容
- c++ - 'operator|' 返回的类型 并不总是与您传递的类型匹配
- c# - 如何在c#中将控制台输出转换为JSON格式输出
- node.js - Visual Studio 应用程序以代码 -1 (0xffffffff) 退出,应用程序没有响应连接 Azure IoT Central
- mercurial - mercurial:如何切换到基于非生锈的 hg 构建
- php - 如何编辑代码以允许用户删除折扣代码
- c# - 如何在c#中复制文件时获取文件名
- python - 如何提高循环遍历 numpy 线性求解的计算效率