打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?

Can std::cout print "NULL" instead of 0 when printing a null pointer?

本文关键字:打印 NULL 空指针 std cout      更新时间:2023-10-16

打印空指针时,std::cout是否可以打印">NULL"而不是0??我可以写一个简单的if语句,比如

if(pointer == nullptr)
std::cout << "NULL";

但是,如果不使用if语句,我能得到同样的结果吗?

使用if语句确实无法转义,但可以使用三元运算符将其转换为一行:(p == NULL ? std::cout << "NULL" : std::cout << p);

#include <iostream>
int main() {
void *p = NULL;
(p == NULL ? std::cout << "NULL" : std::cout << p);
std::cout << std::endl;
p = new int;
(p == NULL ? std::cout << "NULL" : std::cout << p);
std::cout << std::endl;
}

演示

您可以使用三元运算符?

pointer ? std::cout << pointer : std::cout << "NULL";

或者使用gnu c++编译器扩展IF,指针是char*

std::cout << (pointer ?: "NULL");

假定第二种方法不会适用于所有编译器,因为它不是语言的正式组成部分。

我不相信指针有std::boolalpha的等价物。

[编辑]

正如@seleciii44所指出的,在这里的堆栈溢出帖子中,您可以编写自己的重载流插入运算符

std::ostream & operator<<(std::ostream &s, std::nullptr_t)
{
return s << "nullptr";
}

我可以想出两种方法。

1( 明确的方法:使用三元运算符(?:(

cout<<((ptr)?"":"NULLn");

2( 如果你真的不想使用任何条件语句,这是一种糟糕的方式。

cout<<&("NULL"[4*(!!ptr)]);

为什么它有效

ptr将根据其值将ptr的值设置为0或1。

如果为null,cout将看到从0索引开始的char*,并打印"null",否则它将从索引4中看到它,并打印终止字符。

这是一种非常糟糕的方式,因为nullptr可能是实现定义的,并且可能不可移植。