【问题标题】:const volatile char string not printing properlyconst volatile char 字符串无法正确打印
【发布时间】:2017-06-28 21:20:38
【问题描述】:

我有一个非常简单的程序,它只是无限期地输出一个指向 const volatile char 的 const 指针;它是这样的:

const volatile char* const str = "ABCDEFGHIJKL";

while(true) {
    cout << '\r' << str;
}

问题是当运行这个程序时,输出为 1。有一种方法可以解决这个问题,输出 const_cast&lt;char*&gt;(str) 而不是 str

但是如果我这样做 const_cast&lt;volatile char*&gt;(str) 输出是 1,就像在强制转换之前一样,所以我猜测 1 输出是由 volatile 关键字引起的,这很奇怪,因为我认为 volatile 只会使编译器避免对该变量进行优化,这不应该改变它的值。

因此,我的问题是,这个 1 到底是如何作为输出出现的。

注意:

我尝试在 Ubuntu 16.04 中使用 GCC 编译它,在 Windows 7 中使用 MinGW 编译它,所以编译器不是问题(我猜)。

【问题讨论】:

  • 常量和易失性?有意义吗?
  • @user4581301 -- const 和 volatile 在字符串文字上是 not 的。他们在指针上。
  • @PeteBecker 不,它是一个指向 const volatile char 的 const 指针。
  • @manni66 这复制了一个可能被其他来源更改的变量,但从程序的角度来看,它具有一个常量值和地址。

标签: c++ string volatile


【解决方案1】:

你被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

Demo

【讨论】:

  • 转换为指针 --> bool;空指针为假,任何其他值为真。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多