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

时间:2019-10-29 18:36:50

标签: c++ pointers

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

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

但是如果不使用if语句,我是否可以获得相同的结果?

3 个答案:

答案 0 :(得分:4)

使用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;
}

Demo

答案 1 :(得分:3)

您可以使用三元运算符?

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";
}

答案 2 :(得分:3)

我可以想到两种方式。

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

<template>
  <div class="container">
    <h1>Lab</h1>
    <ul>
      <li v-for="project in children" :key="project.id">
        <nuxt-link :to="'/lab/' + project.path">{{project.name}}</nuxt-link>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      children: []
    };
  },
  mounted: function() {
    this.children = this.$router.options.routes.find(
      obj => obj.name === this.$route.name
    ).children;
  }
};
</script>

2)如果您真的不想使用任何条件语句,那是一种讨厌的方式。

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

为什么起作用?

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

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

这是一个非常糟糕的方法,因为nullptr可能是实现定义的,可能不是可移植的。