首页 > 其他分享 >条件语句中同时检查指针空检查和解引用,安全么

条件语句中同时检查指针空检查和解引用,安全么

时间:2024-11-05 11:11:28浏览次数:5  
标签:语句 检查 短路 nullptr 运算符 && 求值 ptr 指针

答案是安全的。

 

条件语句中同时进行空指针检查和解引用,但要确保解引用发生在检查之后,并且需要注意运算符的优先级。

// 例如,在 C++ 中使用逻辑与运算符
if (p != nullptr && *p == someValue) {
    // 这里是安全的,因为 p 的空指针检查在前
    // 可以安全地访问 *p
}

 

在 C/C++ 中,逻辑与运算符(&&)的求值是从左到右的(即左结合性)。这意味着在一个条件表达式中,运算会首先评估左侧的表达式,然后再评估右侧的表达式。这在逻辑与运算中非常重要,因为 C/C++ 实现了“短路求值”(short-circuit evaluation)。

短路求值解释

  1. 短路逻辑与(&&

    • 如果左侧的操作数为 false,那么整个条件表达式的结果必定为 false,此时右侧的操作数将不会被评估。这可以防止不必要的计算或可能导致错误的操作(例如,解引用空指针)。

    例如:

    cpp
  1. int* p = nullptr;
    
    if (p != nullptr && *p == 10) {
        // 这里不会执行解引用,因为左边条件已为 false
    }
    

    在上述代码中,如果 pnullptr*p == 10 的表达式将不会被执行,因为左侧的条件 p != nullptr 已经确定了结果为 false

  2. 总结

    • 条件语句中的逻辑与运算符的求值顺序从左到右。
    • 由于短路求值的特性,可以有效避免在逻辑判断中出现不必要的错误。

示例代码

以下是一个简单的示例,展示了短路求值的特性:

cpp
#include <iostream>

int main() {
    int* ptr = nullptr;

    if (ptr != nullptr && *ptr == 42) {
        std::cout << "Pointer is not null and points to 42." << std::endl;
    } else {
        std::cout << "Either the pointer is null or does not point to 42." << std::endl;
    }

    return 0;
}

在这个示例中,由于 ptrnullptr,所以 *ptr == 42 不会被评估,避免了运行时错误。这显示了逻辑与运算符的求值顺序及其短路行为的好处。

标签:语句,检查,短路,nullptr,运算符,&&,求值,ptr,指针
From: https://www.cnblogs.com/7star/p/18527475

相关文章

  • Neo4j入门:详解Cypher查询语言中的MATCH语句
    Neo4j入门:详解Cypher查询语言中的MATCH语句引言什么是MATCH语句?示例数据1.基础节点查询查询所有节点按标签查询节点2.关系查询基础关系查询指定关系方向指定关系类型3.使用WHERE子句4.使用参数5.多重MATCH和WITH子句实用技巧总结引言大家好!今天我们来学习Neo......
  • left join 出现重复on导致sql语句报错
    leftjoin出现重复on导致sql语句报错​mybatis-plus开启多租户插件功能时,在进行链表查询时会重复出现on导致sql语句报错原因​原因是引入的分页拆件中的jsqlparser解析器和mybatis-plus的jsqlparser解析器冲突了,导致默认采用了分页拆件的jsqlparser解析器​分页拆件......
  • 2024/11/4日 日志 关于JavaScript 变量、数据类型、类型转换和流程控制语句的学习
    经过两天的休憩,状态更佳,后面的笔记和学习进度也会加快JavaScript变量、数据类型、类型转换和流程控制语句点击查看代码----变量--JavaScript中用var关键字(variable的缩写)来声明变量--vartest=20;--test="张三":--·JavaScript是一门弱类型语言变量可......
  • C语言数组指针的使用学习笔记
    一、举例       intarr[5];               //arr是整型数组       int*parr1[10];       //parr1是整型指针数组        int(*parr2)[10]      //parr2是数组指针       int(*parr3[10])[5]  //par......
  • PbootCMS登录请求发生错误,检查服务器环境pathinfo及伪静态规则配置
    确认服务器支持PathinfoNginx配置编辑Nginx配置文件打开你的Nginx配置文件,通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/your_site。找到对应站点的配置块,通常在 server 块内。添加Pathinfo支持在 location 块中添加以下配置:lo......
  • rust学习四、控制语句
    rust的控制语句和大部分语言没有什么区别,都是熟悉的for,while,loop,if。比较不同的是,在绝大部分非常流行的语言中都有的switch,rust是没有的。诸如c/c++,java,javascript,c#。连PL/SQL都有casewhen语句。 一、基本的for、while、if,loop示例-for,while,loop,if/**学习控......
  • 程序流程结构——循环结构||跳转语句
    一、循环结构(一)while循环语句作用:满足循环条件,执行循环语句语法:while(循环条件){循环语句};解释:只要循环条件为真,就执行循环语句例:当我们想要输入0~9这串连续的数字时,我们先创建初始数值为0,利用while循环输出数字,循环条件写在括号中,我们输入的数字为0~9,故(num<10),num++=nu......