C 为什么是';0';将字符串转换为数字时减法?
我是C语言的新手,我在C语言中寻找一个可以将字符串转换成整数的自定义函数,我遇到了这个算法,除了一个部分外,它非常有意义。C 为什么是';0';将字符串转换为数字时减法?,c,C,我是C语言的新手,我在C语言中寻找一个可以将字符串转换成整数的自定义函数,我遇到了这个算法,除了一个部分外,它非常有意义。-'0'在这一行上到底做了什么n=n*10+a[c]-'0' int toString(char a[]) { int c, sign, offset, n; if (a[0] == '-') { // Handle negative integers sign = -1; } if (sign =
-'0'
在这一行上到底做了什么n=n*10+a[c]-'0'代码>
int toString(char a[]) {
int c, sign, offset, n;
if (a[0] == '-') { // Handle negative integers
sign = -1;
}
if (sign == -1) { // Set starting position to convert
offset = 1;
}
else {
offset = 0;
}
n = 0;
for (c = offset; a[c] != '\0'; c++) {
n = n * 10 + a[c] - '0';
}
if (sign == -1) {
n = -n;
}
return n;
}
该算法没有我找到它的地方的解释。假设x
的值在'0'
和'9'
之间,x-'0'
产生一个介于0
和9
之间的值。因此x-'0'
基本上将十进制数字字符常量转换为其数值整数值(例如,'5'
转换为5
)
C说'0'
到'9'
是实现定义的值,但是C也保证'0'
到'9'
是顺序值。假设x
的值在'0'
和'9'
之间,x-'0'
产生一个介于0
和9
之间的值。因此x-'0'
基本上将十进制数字字符常量转换为其数值整数值(例如,'5'
转换为5
)
C说'0'
到'9'
是实现定义的值,但C也保证'0'
到'9'
是顺序值。减去'0'
的原因是十进制数字的字符码点是从'0'
开始顺序排列的,没有间隙。换句话说,'5'
的字符代码大于'0'
的字符代码5;'6'
的字符代码大于'0'
的字符代码6,依此类推。因此,从另一个数字的代码中减去零的代码'0'
,就会产生相应数字的值
这种安排对于ASCII码、EBSDIC码、十进制数字的UNICODE码等都是正确的。对于ASCII代码,数字代码如下所示:
'0' 48
'1' 49
'2' 50
'3' 51
'4' 52
'5' 53
'6' 54
'7' 55
'8' 56
'9' 57
减法'0'
有效的原因是十进制数字的字符代码点从'0'
开始顺序排列,没有间隙。换句话说,'5'
的字符代码大于'0'
的字符代码5;'6'
的字符代码大于'0'
的字符代码6,依此类推。因此,从另一个数字的代码中减去零的代码'0'
,就会产生相应数字的值
这种安排对于ASCII码、EBSDIC码、十进制数字的UNICODE码等都是正确的。对于ASCII代码,数字代码如下所示:
'0' 48
'1' 49
'2' 50
'3' 51
'4' 52
'5' 53
'6' 54
'7' 55
'8' 56
'9' 57
请参阅-注意数字字符的关系(和值)'0'
的值为48,'\0'
的值为0是NUL。请参阅-注意数字字符的关系(和值)'0'
的值为48,'\0'
的值为0是NUL。对不起,我仍然不理解这一点,而且是x
,n
在这种情况下?@Bridenstine这里x
将是a[c]
在你的程序中抱歉,我仍然不理解这一点,并且是x
,n
在这种情况下?@Bridenstine这里x
将是a[c]
在你的程序中