c++ - 使用 cout 将数组和字符打印到屏幕时出现意外结果

标签 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. 为什么下面输出字符串'0xbfd66a88'?我期待它返回数组中第一个元素的地址:

    cout << "Print char array: " << array << endl;
    
  2. 为什么下面输出'98'?我期待它输出字母“b”:

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

最佳答案

1.

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

参见 this question .

2.

这是由于 integral promotion .当您调用二进制文件时 +char (值为“a”)和一个 int (值为 1),编译器提升你的 charsigned intunsigned int .哪一个是特定于实现的——这取决于是否 char默认情况下已签名或未签名,并且 int可拍全系列char .所以,+使用值“97”和“1”调用运算符,并返回值“98”。将其打印为 char ,你需要先施放它:

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

参见 this question .

关于c++ - 使用 cout 将数组和字符打印到屏幕时出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23877634/

相关文章:

javascript - 将php关联数组转换为javascript对象

Java Regex - 获取字符串中子字符串之前的所有单词

objective-c - Swift 将十六进制字符串或字符转换为整数

c++ - 使用 SSE 进行比较和提取

c++ - 如何在 hpp 中声明一个 vector ?

c++ - 在fedora 21上使用自编译的OpenSSL编译bitcoin

python - 如何一次将一个超大文件读入 numpy 数组 N 行

c++ - C++中sizeof运算符的操作

java - 如何向前移动/迭代到数组中的下一个值(java/android)

javascript - 如何根据 JS 中的数字从数字创建数组?