我引用了一个程序进行时间转换,但无法理解代码的某些部分。这是完整的计划。
#include<iostream>
#include<cstdio>
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');
提前致谢。
答案 0 :(得分:6)
如果您看到例如this ASCII table(ASCII是最常用的字符编码方案)您可以看到字符 '2'
具有小数值50
,并且字符{{1具有小数值'0'
。
考虑到一个字符只是一个小整数,我们可以对它们使用常规算法。这意味着,如果你做,例如48
与'2' - '0'
相同,会产生小数值50 - 48
。
因此,要获取字符数字的十进制值,只需减去2
。
与'0'
的乘法是因为我们正在处理十进制系统,其中10
之类的数字与21
相同。< / p>
应该注意的是,C ++规范明确规定所有数字都必须在一个连续的范围内编码,因此无论使用哪种编码都无关紧要。
您可能会看到这个“技巧”也用于获取字母的十进制值,但请注意C ++规范没有说明任何内容。实际上有一些编码,其中字母的范围不是连续的,并且这不起作用。它仅指定用于数字。
答案 1 :(得分:2)
在the ASCCI encoding中,数字按顺序编码。这是:
'/GetFolder procedure from Settings module.
Sub GetFolder(txtDir As TextBox)
Dim fdo As FileDialog
Dim sDir As String
Set fdo = Application.FileDialog(msoFileDialogFolderPicker)
With fdo
.Title = "Select a Directory"
.AllowMultiSelect = False
.InitialFileName = Application.DefaultFilePath
If .Show <> -1 Then GoTo NextCode
sDir = .SelectedItems(1)
txtDir.Value = sDir
Debug.Print txtDir.Value; sDir
End With
NextCode:
' GetFolder = sDir
Set fdo = Nothing
End Sub
的值为'0'
48
的值为'1'
49
的值为'2'
等
因此,50
从'x' - '0' == x
到'0'
例如:
如果你有字符串'9'
,我们有:
12:23:53
hh = (s[0] - '0') * 10 + (s[1] - '0');
表示(s[0] - '0')
等于'1'-'0'
,但这是10,所以1
+ *10
是(s[1] - '0')
,所以2.总共'2'-'0'
。
分钟和秒钟也一样。