考虑这个(人工)示例:
#include <cstdio>
#include <iostream>
int main() {
volatile char test[] = "abc";
std::printf("%s\n", test);
std::cout << test << "\n";
}
使用GCC编译并运行后,会得到以下输出:
$ g++ test.cc
$ ./a.out
abc
1
正如您所看到的,printf
正确地打印字符串,而cout
打印1
。为什么在这种情况下写入cout
会产生1
?
发布于 2014-07-03 21:44:47
operator<<
的唯一合适的重载是用于bool
的重载,因此数组被转换(通过指针)为bool
,由于其地址不为空,因此得到true
。除非使用std::boolalpha
操纵器,否则输出为1
。
它不能对输出字符串的const char *
使用重载,也不能对输出指针值的const void *
使用重载,因为这些转换需要删除volatile
限定符。隐式指针转换可以添加限定符,但不能删除它们。
要输出字符串,必须去掉限定符:
std::cout << const_cast<const char*>(test) << "\n";
但要注意,这会产生未定义的行为,因为该数组将被访问,就好像它不是易失性的一样。
printf
是一个老式的变量函数,没有类型安全性。%s
说明符让它将参数解释为const char *
,不管它实际上是什么。
发布于 2014-07-03 21:50:17
是volatile
限定符将其转换为bool
,请尝试:
std::cout << const_cast<char*>(test) << "\n";
https://stackoverflow.com/questions/24555288
复制相似问题