const volatile char 字符串打印不正确
const volatile char string not printing properly
我有一个非常简单的程序,它只是无限期地输出一个指向 const volatile char 的 const 指针;它是这样的:
const volatile char* const str = "ABCDEFGHIJKL";
while(true) {
cout << '\r' << str;
}
问题是当运行这个程序时,输出是1。有一种方法可以解决这个问题,就是输出const_cast<char*>(str)
而不是str
。
但是如果我做 const_cast<volatile char*>(str)
输出是 1,就像转换之前一样,所以我猜 1 输出是由 volatile
关键字引起的,这很奇怪,因为我认为volatile 只会让编译器避免对该变量进行优化,这不应该改变它的值。
因此,我的问题是 1 作为输出到底是怎么来的。
注意:
我试过在 Ubuntu 16.04 中用 GCC 编译它,在 Windows 7 中用 MinGW 编译它,所以编译器不是问题(我猜)。
你被 Implicit conversion Sequences (ICS) 击中了。 C++ std::ostream
工具没有 volatile
类型的重载。 ICS 启动,并为 bool
类型选择重载(因为指针类型,无论 cv 限定如何,都可以隐式转换为 bool
)。
因此您会看到 1
... 将您的输出更改为 std::boolalpha
,您应该会看到 true
。
示例:
#include <iostream>
#include <iomanip>
int main(){
const volatile char* const str = "ABCDEFGHIJKL";
std::cout << '\r' << str;
std::cout << '\r' << std::boolalpha << str;
}
打印:
1
true
我有一个非常简单的程序,它只是无限期地输出一个指向 const volatile char 的 const 指针;它是这样的:
const volatile char* const str = "ABCDEFGHIJKL";
while(true) {
cout << '\r' << str;
}
问题是当运行这个程序时,输出是1。有一种方法可以解决这个问题,就是输出const_cast<char*>(str)
而不是str
。
但是如果我做 const_cast<volatile char*>(str)
输出是 1,就像转换之前一样,所以我猜 1 输出是由 volatile
关键字引起的,这很奇怪,因为我认为volatile 只会让编译器避免对该变量进行优化,这不应该改变它的值。
因此,我的问题是 1 作为输出到底是怎么来的。
注意:
我试过在 Ubuntu 16.04 中用 GCC 编译它,在 Windows 7 中用 MinGW 编译它,所以编译器不是问题(我猜)。
你被 Implicit conversion Sequences (ICS) 击中了。 C++ std::ostream
工具没有 volatile
类型的重载。 ICS 启动,并为 bool
类型选择重载(因为指针类型,无论 cv 限定如何,都可以隐式转换为 bool
)。
因此您会看到 1
... 将您的输出更改为 std::boolalpha
,您应该会看到 true
。
示例:
#include <iostream>
#include <iomanip>
int main(){
const volatile char* const str = "ABCDEFGHIJKL";
std::cout << '\r' << str;
std::cout << '\r' << std::boolalpha << str;
}
打印:
1
true