我正在经历一些练习问题,我看到了这段代码:
#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;
}
有人可以解释代码的作用,特别是48部分的减法吗?
答案 0 :(得分: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';
在这个版本中,意图可能稍微清楚一点。
您当然可以通过添加进行“反向”映射,例如5 + '0' == '5'
。同样,如果您的char
包含'A'..'Z'
范围内的字母,则可以从中“减去”'A'
以获取0..25
范围内该字母的索引。
'0'
和48
进行减法!如上所述,原始- 48
代码假定使用的字符编码是ASCII。 - '0'
不仅提高了可读性,还放弃了ASCII假设,并且可以使用任何编码,如C语言所规定的那样,规定必须在连续的块中顺序编码数字字符
另一方面,没有对字母作出这样的规定。因此,在您使用EBCDIC编码的罕见情况下,例如,将'A'..'Z'
映射到0..25
不再像减去'A'
一样简单,因为字母是< em> NOT 在EBCDIC的连续块中顺序编码。
一些编程语言通过强制使用一个特定的编码来表示源代码来简化问题(例如Java使用Unicode:JLS §3.1)
答案 1 :(得分:5)
查找字符串s中的数字总和。
sum += s[i] - 48;
将ASCII字符转换为数字值。
答案 2 :(得分:2)
它加起来3 + 5 + 7,然后打印
总和是15
-48
部分是它减去字符0,即ascii值为0。
它的作用是
'3' - '0' > 51 - 48
'5' - '0' > 53 - 48
'7' - '0' > 55 - 48
如您所见,在C中,'0'(字符零)与0(数字0)不同。它们具有不同的价值(除其他外)
答案 3 :(得分:1)
我建议编写一个测试程序来查看s []的值是什么。您也可以在“0123456789”中打印出每个条目的所有值。
我认为你会很快意识到它在做什么,尽管这段代码依赖于ASCII编码。
玩得开心!