我对这一行感到困惑:
sum += a[s[i] - '0'];
为了给出一些上下文,这是代码的其余部分:
#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;
}
最佳答案
- '0'
(或便携性较差的- 48
,仅适用于ASCII)用于通过数字字符的十进制代码,C++ (和 C) 保证所有编码中的连续数字。
在 EBCDIC ,例如,代码范围从 '0'
的 240
到 '9'
的 249
,这将使用 - '0'
可以正常工作,但使用 - 48
会失败)。 仅出于这个原因,最好始终像您一样使用 - '0'
表示法。
以 ASCII 为例,如果 '1'
的 ASCII 码是 49
并且 '0'
的 ASCII 码是 48
、49 - 48 = 1
,或采用推荐的格式'1' - '0' = 1
。
所以,正如您现在可能已经想到的那样,您可以使用这个简单的算术将字符中的所有 10 位数字转换为它是通过添加 '0'
进行字符编码。
除了代码中还有一些其他问题:
- 数组不会在索引
0
处开始填充,而是在索引1
处开始填充,因此如果您的字符串输入例如是"10"
sum
将是a[1]
+a[0]
,但a[0]
没有赋值,所以 behaviour is undefined ,您需要注意这些情况。
for (int i = 0; i < 5; i ++)
cin >> a[i];
会更合适,索引从0
到4
,因为数组有5个索引,如果你想输入1到5的数字,你可以减去1
稍后从 到索引。
- 正如评论部分所指出的,错误的输入(例如字母字符)也会引发未定义的行为。
关于c++ - 为什么需要在索引中添加 '0' 才能访问数组值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60994353/