为什么以下代码块给出输出 "ZZZ(some garbage value)" 而不是 "ZZ(some garbage value)"
Why the following code block is giving output "ZZZ(some garbage value)" instead of "ZZ(some garbage value)"
在打印 &a (cout<<&a
) 时,编译器给出输出 'Z' 但是当我们在打印字符地址之前打印字符时它给出输出 (cout<<a<<" "<<&a
) 作为 'Z ZZ'.我知道 cout 对字符地址的处理方式不同,即在获取字符地址时,它不会打印该地址,而是打印该地址处的内容。请帮助我解决我在这里缺少的概念。这是代码片段:
#include <iostream>
using namespace std;
int main() {
char a = 'Z';
cout<<a<<&a;
return 0;
}
char a = 'Z';
cout << &a;
这会将 a
的地址视为空终止字符串的地址并打印该字符串。由于这不是指向空终止字符串的指针(它是指向单个 char
的指针),因此您的程序中存在未定义的行为。
未定义的行为意味着程序没有定义的行为,即它可以有任何行为:它可以打印垃圾,它可以打印其他垃圾,它可以不打印任何东西,它可以崩溃或几乎任何行为.
如果要输出变量的地址a
那么写
char a = 'Z';
cout << a << static_cast<void *>( &a );
否则,编译器会尝试输出表达式 &a
指向的字符串,其类型为 char *
,直到遇到零终止字符。
因此这个输出
cout << &a;
有未定义的行为。
如果要将变量 a 输出为包含字符串的数组,则必须声明一个数组而不是标量变量,并使用字符串文字而不是字符文字对其进行初始化。例如
char a[] = "Z";
cout << *a << &a;
在打印 &a (cout<<&a
) 时,编译器给出输出 'Z' 但是当我们在打印字符地址之前打印字符时它给出输出 (cout<<a<<" "<<&a
) 作为 'Z ZZ'.我知道 cout 对字符地址的处理方式不同,即在获取字符地址时,它不会打印该地址,而是打印该地址处的内容。请帮助我解决我在这里缺少的概念。这是代码片段:
#include <iostream>
using namespace std;
int main() {
char a = 'Z';
cout<<a<<&a;
return 0;
}
char a = 'Z';
cout << &a;
这会将 a
的地址视为空终止字符串的地址并打印该字符串。由于这不是指向空终止字符串的指针(它是指向单个 char
的指针),因此您的程序中存在未定义的行为。
未定义的行为意味着程序没有定义的行为,即它可以有任何行为:它可以打印垃圾,它可以打印其他垃圾,它可以不打印任何东西,它可以崩溃或几乎任何行为.
如果要输出变量的地址a
那么写
char a = 'Z';
cout << a << static_cast<void *>( &a );
否则,编译器会尝试输出表达式 &a
指向的字符串,其类型为 char *
,直到遇到零终止字符。
因此这个输出
cout << &a;
有未定义的行为。
如果要将变量 a 输出为包含字符串的数组,则必须声明一个数组而不是标量变量,并使用字符串文字而不是字符文字对其进行初始化。例如
char a[] = "Z";
cout << *a << &a;