作为学习C ++的初学者,我试图理解类型char
的数组和类型int
的数组之间的区别。这是我的代码:
void IntArray () {
int array[5] = {5,6,7,8,9};
cout << "Print int array: " << array << endl;
cout << "Print int array[0]: " << array[0] << endl;
cout << "Print int array[0]+1: " << array[0]+1 << endl;
}
void CharArray () {
char array[5] = {'a', 'b', 'c', 'd', '\0'};
cout << "Print char array: " << array << endl;
cout << "Print char array[0]: " << array[0] << endl;
cout << "Print char array[0]+1: " << array[0]+1 << endl;
}
这是输出:
Print int array: 0xbfd66a88
Print int array[0]: 5
Print int array[0]+1: 6
Print char array: abcd
Print char array[0]: a
Print char array[0]+1: 98
我的问题是:
为什么以下输出字符串&#39; 0xbfd66a88&#39;?我期待它返回数组中第一个元素的地址:
cout << "Print char array: " << array << endl;
为什么以下输出&#39; 98&#39;?我期待它输出字母&#39; b&#39;:
cout << "Print char array[0]+1: " << array[0]+1 << endl;
答案 0 :(得分:2)
由于char
数组在将其流式传输到cout
时与其他数组的处理方式不同,因此<<
运算符会因const char*
而重载。这是为了与C兼容,因此以null结尾的char
数组被视为字符串。
请参阅this question。
这是由于integral promotion。当您使用+
(值为&#39; a&#39;)和char
(值为1)调用二进制int
时,编译器会提升您的{{1} } char
或signed int
。哪一个是特定于实现的 - 具体取决于默认情况下unsigned int
是签名还是未签名,以及char
可以占用int
的全部范围。因此,char
运算符的值为&#39; 97&#39;和&#39; 1&#39;,它返回值&#39; 98&#39;。要将其打印为+
,您需要首先投射它:
char
请参阅this question。
答案 1 :(得分:1)
好的,让我们分别讨论一下。
Print int array: 0xbfd66a88
在这里打印一个int [],它进入带有int *的operator <<
重载。当您打印指针时,您会看到十六进制格式的内存地址。
Print int array[0]: 5
在这里打印数组的第一个元素int
。正如所料。
Print int array[0]+1: 6
在这里,您将1添加到数组的第一个元素并打印结果,该结果仍为int
。 5 + 1变为6.这里没有神秘感。
Print char array: abcd
这有点棘手。您打印char[]
并且operator <<
有一个特殊的重载,需要const char*
并且会调用一个。{1}}。这个重载的作用是从指针指向的地址开始打印每个字符,直到找到终止零。
Print char array[0]: a
在这里打印char
,以便调用char
的重载。它打印相应的ASCII字符,即&#39; a&#39;。
Print char array[0]+1: 98
此处operator+
的结果是int
,因为文字1是int
,char
值被提升为更宽的类型(int
)。结果是98,因为字母的ASCII码&#39; a&#39;是97.打印此int
时,您只看到数字。