为什么需要在索引中添加“0”才能访问数组值?

Zac*_*ary 3 c++ char indices character-set

我对这一行感到困惑:

sum += a[s[i] - '0']; 
Run Code Online (Sandbox Code Playgroud)

给出一些上下文,这是代码的其余部分:

#include <iostream>

using namespace std;

int main() {

    int a[5];
    for (int i = 1; i <= 4; i++)
        cin >> a[i];
    string s;
    cin >> s;
    int sum = 0;
    for (int i = 0; i < s.size(); i++)
        sum += a[s[i] - '0'];
    cout << sum << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

ana*_*ciu 6

- '0'(或不太便携- 48,仅适用于ASCII)用于通过十进制代码将数字字符手动转换为整数,C++(和 C)保证所有编码中的连续数字。

例如,在EBCDIC 中,代码范围从240for'0'249for '9',这适用于- '0',但会失败- 48)。仅出于这个原因,最好始终- '0'像您一样使用符号

用于ASCII例如,如果'1'的ASCII码是49'0'的ASCII码是4849 - 48 = 1,或在推荐的格式'1' - '0' = 1

因此,正如您现在可能已经想到的那样,您可以使用这个简单的算术从字符中转换所有 10 位数字,只需减去'0',在另一个方向上,您可以通过添加'0'.

除此之外,代码中还有一些其他问题:

  • 该阵列不启动索引被填充0,但在指数1,所以如果你的字符串输入,例如,"10"suma[1]+ a[0],但a[0]尚未分配的值,因此行为是不确定的,你需要WACH了这些情况。
for (int i = 0; i < 5; i ++)
    cin >> a[i];
Run Code Online (Sandbox Code Playgroud)

索引从0to会更合适,4因为数组有 5 个索引,如果你想输入从 1 到 5 的数字,你可以稍后1从 to 索引中减去。

  • 正如评论部分所指出的,例如,带有字母字符的错误输入也会引发未定义的行为。