为啥下面的代码块给出输出“ZZZ(一些垃圾值)”而不是“ZZ(一些垃圾值)”

Posted

技术标签:

【中文标题】为啥下面的代码块给出输出“ZZZ(一些垃圾值)”而不是“ZZ(一些垃圾值)”【英文标题】:Why the following code block is giving output "ZZZ(some garbage value)" instead of "ZZ(some garbage value)"为什么下面的代码块给出输出“ZZZ(一些垃圾值)”而不是“ZZ(一些垃圾值)” 【发布时间】:2019-10-28 16:14:51 【问题描述】:

在打印 &a (cout<<&a) 时,编译器给出输出“Z”,但是当我们在打印字符地址之前打印字符时,它给出的输出(cout<<a<<" "<<&a) 为“Z ZZ”。我知道 cout 对字符地址的处理方式不同,即在获取字符地址时,它不会打印该地址,而是打印该地址处的内容。请帮助我解决我在这里缺少的概念。这是代码sn-p:

#include <iostream>
using namespace std;
int main() 
    char a = 'Z';
    cout<<a<<&a;
    return 0;

【问题讨论】:

我问你,为什么第三个Z不能是垃圾值? 我没有得到你得到的“垃圾值”。 onlinegdb.com/r1Znrc49S 您正试图预测未定义的行为。根据定义,这是徒劳的。 仅仅因为你多次看到相同的输出并不意味着它有保证。未定义的行为只是未定义的,也就是任何事情都可能发生 因为它是未定义的行为。任何事情都有可能发生。 【参考方案1】:
char a = 'Z';
cout << &a;

这会将a 的地址视为空终止字符串的地址并打印此字符串。由于这不是指向空终止字符串的指针(它是指向单个 char 的指针),因此您的程序中有未定义的行为。

未定义的行为意味着程序没有定义的行为,即它可以有任何行为:它可以打印垃圾,它可以打印其他垃圾,它不能打印任何东西,它可以崩溃或几乎任何行为。

【讨论】:

【参考方案2】:

如果要输出变量a的地址那么写

char a = 'Z';
cout << a << static_cast<void *>( &a );

否则编译器会尝试输出由表达式&amp;a 指向的字符串,该字符串的类型为char *,直到遇到零终止字符。

因此这个输出

cout << &a;

有未定义的行为。

如果要将变量 a 输出为具有字符串的数组,则必须声明一个数组而不是标量变量,并使用字符串文字而不是字符文字对其进行初始化。例如

char a[] = "Z";
cout << *a << &a;

【讨论】:

值得一提(更明确地)字符数组是空终止的

以上是关于为啥下面的代码块给出输出“ZZZ(一些垃圾值)”而不是“ZZ(一些垃圾值)”的主要内容,如果未能解决你的问题,请参考以下文章

为啥下面的代码块应该返回 false?

为啥下面的代码给出 'std::logic_error' what(): basic_string::_M_construct null not valid?

为啥 QDatastream 没有给出正确的输出

为啥在 Array.ForEach 输出 333 而不是 0112? [复制]

为啥jQuery在输出html代码后下面的内容不再执行了

为啥下面的系统调用输出不重定向到文件?