在打印空指针时,std::cout
是否可以打印“ NULL ”而不是“ 0 ”?我可以写一个简单的if语句,例如
if(pointer == nullptr)
std::cout << "NULL";
但是如果不使用if语句,我是否可以获得相同的结果?
答案 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;
}
答案 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可能是实现定义的,可能不是可移植的。