我正在做一些练习题,我看到了下面的代码:
#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部分的减法?
5条答案
按热度按时间yeotifhr1#
该代码基本上对表示为字符串的数字求和。它做了两个重要的假设才能正常工作:
'0'..'9'
范围内的字符在ASCII中为
'0' == 48
、'1' == 49
等。因此为'0' - 48 == 0
、'1' - 48 == 1
等。也就是说,减去48会将char
值'0'..'9'
转换为int
值0..9
。因此,正是因为
'0' == 48
,代码还可以用于:这个版本的意图也许稍微清楚一些。
当然,你也可以通过加法来做“反向”Map,例如
5 + '0' == '5'
,类似地,如果你有一个包含'A'..'Z'
范围内的一个字母的char
,你可以从它“减去”'A'
来得到这个字母在0..25
范围内的索引。另请参见
相关问题
'0'
和48
!在替代编码上
如前所述,原始的
- 48
代码假设使用的字符编码是ASCII。- '0'
不仅提高了可读性,而且放弃了ASCII假设,并将与 any 编码一起工作,如C语言所规定的,该语言规定数字字符必须在连续块中顺序编码。另一方面,对于字母没有这样的规定,因此,在使用EBCDIC编码的罕见情况下,例如,将
'A'..'Z'
Map到0..25
不再像减去'A'
那么简单,因为在EBCDIC中,字母是在连续块中按顺序进行 NOT 编码的。一些编程语言通过强制使用一种特定的编码来表示源代码来简化问题(例如,Java使用Unicode:JLS §3.1)
另请参见
相关问题
tyg4sfes2#
求字符串s中所有数字的和。
sum += s[i] - 48;
将ASCII字符转换为数值。r7s23pms3#
它加起来是3 + 5 + 7,然后打印
总和为15
-48
部分是减去字符0,即0的ASCII值。它的作用是
正如你所看到的,在C语言中,“0”(字符零)和0(数字0)是不同的,它们有不同的值(还有其他的)
bq9c1y664#
我建议编写一个测试程序,看看s []的值显示了什么。你也可以打印出"0123456789"中每个条目的所有值。
我想您很快就会意识到它在做什么,尽管这段代码依赖于ASCII编码。
好好玩!
au9on6nz5#
尝试初始化变量时不要使用单引号,这样应该可以给予精确的值,这与ASCII不同