为啥下面的代码块给出输出“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 );
否则编译器会尝试输出由表达式&a
指向的字符串,该字符串的类型为char *
,直到遇到零终止字符。
因此这个输出
cout << &a;
有未定义的行为。
如果要将变量 a 输出为具有字符串的数组,则必须声明一个数组而不是标量变量,并使用字符串文字而不是字符文字对其进行初始化。例如
char a[] = "Z";
cout << *a << &a;
【讨论】:
值得一提(更明确地)字符数组是空终止的以上是关于为啥下面的代码块给出输出“ZZZ(一些垃圾值)”而不是“ZZ(一些垃圾值)”的主要内容,如果未能解决你的问题,请参考以下文章
为啥下面的代码给出 'std::logic_error' what(): basic_string::_M_construct null not valid?