使用cout将数组和char打印到屏幕时出现意外结果

时间:2014-05-26 20:58:23

标签: c++ arrays string char

作为学习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

我的问题是:

  1. 为什么以下输出字符串&#39; 0xbfd66a88&#39;?我期待它返回数组中第一个元素的地址:

    cout << "Print char array: " << array << endl;
    
  2. 为什么以下输出&#39; 98&#39;?我期待它输出字母&#39; b&#39;:

    cout << "Print char array[0]+1: " << array[0]+1 << endl;
    

2 个答案:

答案 0 :(得分:2)

1

由于char数组在将其流式传输到cout时与其他数组的处理方式不同,因此<<运算符会因const char*而重载。这是为了与C兼容,因此以null结尾的char数组被视为字符串。

请参阅this question

2

这是由于integral promotion。当您使用+(值为&#39; a&#39;)和char(值为1)调用二进制int时,编译器会提升您的{{1} } charsigned 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是intchar值被提升为更宽的类型(int )。结果是98,因为字母的ASCII码&#39; a&#39;是97.打印此int时,您只看到数字。