请解释此代码的作用(someChar - 48)

q3qa4bjr  于 2023-01-20  发布在  其他
关注(0)|答案(5)|浏览(161)

我正在做一些练习题,我看到了下面的代码:

#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部分的减法?

yeotifhr

yeotifhr1#

该代码基本上对表示为字符串的数字求和。它做了两个重要的假设才能正常工作:

  • 字符串仅包含'0'..'9'范围内的字符
  • 使用的字符编码为ASCII

在ASCII中为'0' == 48'1' == 49等。因此为'0' - 48 == 0'1' - 48 == 1等。也就是说,减去48会将char'0'..'9'转换为int0..9
因此,正是因为'0' == 48,代码还可以用于:

sum += s[i] - '0';

这个版本的意图也许稍微清楚一些。
当然,你也可以通过加法来做“反向”Map,例如5 + '0' == '5',类似地,如果你有一个包含'A'..'Z'范围内的一个字母的char,你可以从它“减去”'A'来得到这个字母在0..25范围内的索引。

另请参见

相关问题

在替代编码上

如前所述,原始的- 48代码假设使用的字符编码是ASCII。- '0'不仅提高了可读性,而且放弃了ASCII假设,并将与 any 编码一起工作,如C语言所规定的,该语言规定数字字符必须在连续块中顺序编码。
另一方面,对于字母没有这样的规定,因此,在使用EBCDIC编码的罕见情况下,例如,将'A'..'Z'Map到0..25不再像减去'A'那么简单,因为在EBCDIC中,字母是在连续块中按顺序进行 NOT 编码的。
一些编程语言通过强制使用一种特定的编码来表示源代码来简化问题(例如,Java使用Unicode:JLS §3.1)

另请参见

相关问题

tyg4sfes

tyg4sfes2#

求字符串s中所有数字的和。
sum += s[i] - 48;将ASCII字符转换为数值。

r7s23pms

r7s23pms3#

它加起来是3 + 5 + 7,然后打印
总和为15
-48部分是减去字符0,即0的ASCII值。
它的作用是

'3' - '0' > 51 - 48
'5' - '0' > 53 - 48
'7' - '0' > 55 - 48

正如你所看到的,在C语言中,“0”(字符零)和0(数字0)是不同的,它们有不同的值(还有其他的)

bq9c1y66

bq9c1y664#

我建议编写一个测试程序,看看s []的值显示了什么。你也可以打印出"0123456789"中每个条目的所有值。
我想您很快就会意识到它在做什么,尽管这段代码依赖于ASCII编码。
好好玩!

au9on6nz

au9on6nz5#

尝试初始化变量时不要使用单引号,这样应该可以给予精确的值,这与ASCII不同

相关问题