Unexpected results when printing array and char to

2020-03-31 05:32发布

As a beginner of learning C++, I am trying to understand the difference between an array of type char and an array of type int. Here is my code:

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;
}

And here is the output:

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

My questions are:

  1. Why does the following output the string '0xbfd66a88'? I was expecting it to return the address of the first element in the array:

    cout << "Print char array: " << array << endl;
    
  2. Why does the following output '98'? I was expecting it to output the letter 'b':

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

2条回答
狗以群分
2楼-- · 2020-03-31 06:18

1.

Because char arrays are treated differently to other arrays when you stream them to cout - the << operator is overloaded for const char*. This is for compatibility with C, so that null-terminated char arrays are treated as strings.

See this question.

2.

This is due to integral promotion. When you call the binary + with a char (with value 'a') and an int (with value 1), the compiler promotes your char to either a signed int or an unsigned int. Which one is implementation specific - it depends on whether char is signed or unsigned by default, and which int can take the full range of char. So, the + operator is called with the values '97' and '1', and it returns the value '98'. To print that as a char, you need to first cast it:

cout << "Print char array[0]+1: " << static_cast<char>(array[0]+1) << endl;

See this question.

查看更多
家丑人穷心不美
3楼-- · 2020-03-31 06:28

Okay let's go over each separately.

Print int array: 0xbfd66a88

Here you print an int[] which goes into the operator << overload that takes int*. And when you print a pointer you see a memory address in hexadecimal format.

Print int array[0]: 5

Here you print the first element of the array which is an int. As expected.

Print int array[0]+1: 6

Here you add 1 to the first element of the array and print the result, which is still an int. 5+1 becomes 6. No mystery here.

Print char array: abcd

This is a bit trickier. You print a char[] and there is a special overload for operator << that takes a const char* and that one gets called. What this overload does is print each character beginning from the address where the pointer points until it finds a terminating zero.

Print char array[0]: a

Here you print a char so the overload that takes char gets called. It prints the corresponding ASCII character, which is 'a'.

Print char array[0]+1: 98

Here the result of operator+ is an int because the literal 1 is an int and the char value gets promoted to the wider type (int). The result is 98 because the ASCII code of the letter 'a' is 97. When you print this int you just see the number.

查看更多
登录 后发表回答