作者:shzq110_113 | 来源:互联网 | 2022-12-30 10:07
我引用了一个时间转换程序,但无法理解代码的某些部分.这是完整的计划.
#include
#include
using namespace std;
int main() {
string s;
cin >> s;
int n = s.length();
int hh, mm, ss;
hh = (s[0] - '0') * 10 + (s[1] - '0');
mm = (s[3] - '0') * 10 + (s[4] - '0');
ss = (s[6] - '0') * 10 + (s[7] - '0');
if (hh <12 && s[8] == 'P') hh += 12;
if (hh == 12 && s[8] == 'A') hh = 0;
printf("%02d:%02d:%02d\n", hh, mm, ss);
return 0;
}
我无法理解的代码部分是
hh = (s[0] - '0') * 10 + (s[1] - '0');
mm = (s[3] - '0') * 10 + (s[4] - '0');
ss = (s[6] - '0') * 10 + (s[7] - '0');
提前致谢.
1> Some program..:
如果您看到例如此ASCII表(ASCII是最常用的字符编码方案),您可以看到该字符 '2'
具有十进制值50
,并且该字符'0'
具有十进制值48
.
考虑到一个字符只是一个小整数,我们可以对它们使用常规算术.这意味着如果你这样做'2' - '0'
,那就像50 - 48
产生小数值那样2
.
因此,要获取字符数字的十进制值,只需减去'0'
.
乘法10
是因为我们正在处理十进制系统,其中一个数字21
是相同的2 * 10 + 1
.
应该注意的是,C++规范明确规定所有数字都必须在一个连续的范围内编码,因此无论使用哪种编码都无关紧要.
您可能会看到这个"技巧"也用于获取字母的十进制值,但请注意C++规范没有说明任何内容.事实上,编码中的字母范围不是连续的,而且不起作用.它仅指定用于数字.