C++ 判断指针为空的写法

C++之父推荐的指针判空方式为直接使用(p)或(!p),而非(p==NULL)或(p!=NULL),以提高代码的可扩展性和适应原生指针包装类。若使用NULL,需注意其在不同平台可能代表不同非法地址。

C++之父的C++圣经《C++程序设计语言 特别版》中说:
大家不要听某些人说判断指针是否为空用(p==NULL)或(p!=NULL)的格式,C++之父认为这样写是不好的,提倡直接写(p)或(!p)的形式。 在win32开发中,if ( NULL == p )是极好的写法。但不要写成:if ( p == NULL ) 
C++之父主要是反对使用“NULL”,因为在某些特殊的开发环境叫,“NULL”并非补定义成地址0,也可能是一个跟平台相关的,用于标记非法地址的其它地址。
但按照C++标准的规定,只有等于0的地址可以被随便delete多次,因此如果是别的地址,那至少C++标准就给不了任何说法。至于是if(p == 0)和if(p != 0),还是if(p)或者if(!p),这个找不出什么重大区别,个人觉得。
不过,从代码的可扩展性上讲,写成后者可能好一些,因为如果有一天你决定改用一些原生指针的包装类(比如类似那种auto_ptr模板的)来代替直接操作原生指针,而那个类可能重载了operator!,后者可能让你直接利用这些设施 林锐提倡if ( p == NULL )是从代码的可读性上考虑的,一看就是在判断一个指针,而不是判断一个bool值,它提倡只有bool值才使用if(p)或者if(!p)的形式。
BS是从可移植方面考虑。
if( p == NULL ),一眼就可以看出这是在判断一个指针,但如果写成if(!p),那你必须要知道p倒底是什么才能知道这个判断的含义。另外,不要写成if( p == NULL )这样的形式,应该写成:if ( NULL == p )。
如果你误写成了if ( NULL = p ),那编译时就会提示你,但如果是前者,这个错误就隐藏起来了。

### Java 中使用 Optional 类处理空指针异常的最佳实践 在 Java 编程中,`Optional` 是一种用于显式表示可能为的对象容器的工具类。它可以帮助开发者更清晰地表达逻辑,并有效减少因未检查 null 值而引发的运行时错误。以下是关于 `Optional` 的一些最佳实践: #### 使用场景 当方法返回值可能是 null 时,推荐将其封装到 `Optional` 对象中,而不是直接返回 null[^1]。 ```java public Optional<String> getName() { String name = ...; // 可能为 null 的计算过程 return Optional.ofNullable(name); } ``` 这种方法明确了调用者需要主动检查是否存在实际值,从而降低了隐含假设带来的风险。 #### 避免链式操作中的潜在问题 虽然可以直接对 `Optional` 进行链式调用 (如 `.map()` 或 `.flatMap()`) 来简化代码结构,但在复杂业务逻辑下应谨慎设计这些链条以防止意外行为。 #### 替代传统条件判断 相比传统的 if-else 结构来验证对象是否为 null ,利用 `ifPresent()` 方法可以让意图更加直观简洁: ```java optionalValue.ifPresent(value -> System.out.println("Value is present: " + value)); ``` 此方式不仅提高了可读性还减少了冗余代码量。 --- ### C/C++ 中检查指针是否为的最佳实践 对于 C 和 C++ 而言, 判断一个变量是否指向有效的内存地址通常涉及对其值与零值之间的对比运算。由于历史原因以及跨平台兼容性的考虑,在不同环境中实现细节可能存在差异;然而现代标准已经统一规定了某些约定俗成的做法以便于移植性和安全性考量。 #### 初始化阶段即设定默认状态 按照惯例最好是在声明的同时完成必要的初始化工作,这样即使后续忘记设置具体目标也不会轻易触发非法访问的风险[^3]: ```c++ char* pStr = nullptr; int* iParam = NULL; ``` 上述例子展示了两种风格写法都可以接受但建议优先采用前者(`nullptr`)因为它具有更强类型安全特性尤其适用于泛型模板场合[^4]. #### 显式的非断言 无论何时只要涉及到动态分配资源或者接收外部输入参数都应当加入相应的有效性校验环节确保不会误操作悬垂指针等问题实例[^2]: ```cpp void processBuffer(const char* buffer){ assert(buffer != nullptr && "Input buffer must not be null"); // 正常流程... } // 或者简单形式 if(!buffer || strlen(buffer)==0){ throw std::invalid_argument("Invalid argument provided."); } ``` 这里通过宏定义 ASSERT 宏或 STL 提供的功能组件快速定位问题源头同时给出友好提示信息便于调试追踪. 另外值得注意的是尽管当前大多数编译器能够自动优化掉多余的比较动作(比如针对静态已知常量),仍然提倡保留此类防护措施作为良好编码习惯的一部分. --- ### 总结 无论是高级语言还是低级语言环境里妥善管理好引用关系始终是一项重要课题。借助像 Java 的 Optional 这样的抽象机制可以极大程度上改善应用程序质量;而在原生支持较少辅助功能的语言领域则更要依赖程序员自身的严谨态度去构建坚固防线抵御各种边界情况挑战[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值