【问题标题】:Can std::cout print "NULL" instead of 0 when printing a null pointer?打印空指针时,std::cout 可以打印“NULL”而不是 0 吗?
【发布时间】:2019-10-29 18:36:50
【问题描述】:

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

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

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

【问题讨论】:

标签: c++ pointers


【解决方案1】:

您无法真正使用 if 语句进行转义,但您可以使用三元运算符将其变为单行: (p == NULL ? std::cout &lt;&lt; "NULL" : std::cout &lt;&lt; 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;
}

Demo

【讨论】:

    【解决方案2】:

    您可以使用三元运算符?

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

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

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

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

    我不认为有与 std::boolalpha 等效的指针。

    [编辑]

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

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

    【讨论】:

    【解决方案3】:

    我可以想到两种方法。

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

        cout<<((ptr)?"":"NULL\n");
    

    2) 讨厌的方式,如果你真的不想使用任何条件语句。

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

    为什么有效?

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

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

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

    【讨论】:

    • 从技术上讲,它不会打印终止字符。终止符 \0 结束循环,因此不打印任何字符。应该非常便携,因为所有操作都定义明确。但可能会造成混淆,因此如果在生产代码中使用,则值得注释。
    • 可以使用cout &lt;&lt; &amp;"\0NULL"&lt;:!ptr:&gt;; 来震惊你的同事。
    • 唯一的问题是它不会打印指针,如果它是有效的......不过聪明的想法
    猜你喜欢
    • 2013-01-29
    • 2019-08-06
    • 2020-08-09
    相关资源
    最近更新 更多