use*_*886 7 c encoding ascii char
我正在经历一些练习问题,我看到了这段代码:
#include <stdio.h>
#include <string.h>
int main(void) {
char* s = "357";
int sum = 0;
int i = 0;
for (i = 0; i < strlen(s); i++) {
sum += s[i] - 48;
}
printf("Sum is %d", sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释代码的作用,尤其是48部分的减法吗?
pol*_*nts 32
代码基本上将表示为字符串的数字的数字相加.它使两个重要的假设正常工作:
'0'..'9'范围中的字符在ASCII, ,'0' == 48,'1' == 49等等.因此,'0' - 48 == 0,'1' - 48 == 1,等等.也就是说,减去48会将char值'0'..'9'转换为int值0..9.
因此,正是因为'0' == 48,代码也适用于:
sum += s[i] - '0';
Run Code Online (Sandbox Code Playgroud)
在这个版本中,意图可能稍微清楚一些.
你当然可以通过添加进行"反向"映射,例如5 + '0' == '5'.同样,如果您char在'A'..'Z'范围内包含一个字母,您可以从中"减去" 'A'以获得该0..25范围内该字母的索引.
'0'和48!如上所述,原始- 48代码假定使用的字符编码是ASCII.- '0'不仅提高了可读性,而且放弃了ASCII假设,并且可以使用C语言规定的任何编码,C语言规定必须在连续的块中顺序编码数字字符.
另一方面,没有对字母作出这样的规定.因此,在您使用EBCDIC编码的罕见情况下,例如,映射'A'..'Z'到0..25不再像减法一样简单'A',因为字母不是在EBCDIC中的连续块中按顺序编码的.
一些编程语言通过强制使用一个特定的编码来表示源代码来简化问题(例如,Java使用Unicode:JLS§3.1)