首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么ostream会为定义为` `volatile char[]`的字符串打印`1‘?

为什么ostream会为定义为` `volatile char[]`的字符串打印`1‘?
EN

Stack Overflow用户
提问于 2014-07-03 21:39:56
回答 2查看 603关注 0票数 16

考虑这个(人工)示例:

代码语言:javascript
复制
#include <cstdio>
#include <iostream>

int main() {
  volatile char test[] = "abc";
  std::printf("%s\n", test);
  std::cout << test << "\n";
}

使用GCC编译并运行后,会得到以下输出:

代码语言:javascript
复制
$ g++ test.cc 
$ ./a.out 
abc
1

正如您所看到的,printf正确地打印字符串,而cout打印1。为什么在这种情况下写入cout会产生1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-03 21:44:47

operator<<的唯一合适的重载是用于bool的重载,因此数组被转换(通过指针)为bool,由于其地址不为空,因此得到true。除非使用std::boolalpha操纵器,否则输出为1

它不能对输出字符串的const char *使用重载,也不能对输出指针值的const void *使用重载,因为这些转换需要删除volatile限定符。隐式指针转换可以添加限定符,但不能删除它们。

要输出字符串,必须去掉限定符:

代码语言:javascript
复制
std::cout << const_cast<const char*>(test) << "\n";

但要注意,这会产生未定义的行为,因为该数组将被访问,就好像它不是易失性的一样。

printf是一个老式的变量函数,没有类型安全性。%s说明符让它将参数解释为const char *,不管它实际上是什么。

票数 14
EN

Stack Overflow用户

发布于 2014-07-03 21:50:17

volatile限定符将其转换为bool,请尝试:

代码语言:javascript
复制
std::cout << const_cast<char*>(test) << "\n";
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24555288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档