请解释这段代码在做什么(someChar - 48)

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

在ASCII, ,'0' == 48,'1' == 49等等.因此,'0' - 48 == 0,'1' - 48 == 1,等等.也就是说,减去48会将char'0'..'9'转换为int0..9.

因此,正是因为'0' == 48,代码也适用于:

sum += s[i] - '0';
Run Code Online (Sandbox Code Playgroud)

在这个版本中,意图可能稍微清楚一些.

你当然可以通过添加进行"反向"映射,例如5 + '0' == '5'.同样,如果您char'A'..'Z'范围内包含一个字母,您可以从中"减去" 'A'以获得该0..25范围内该字母的索引.

也可以看看

相关问题


关于替代编码

如上所述,原始- 48代码假定使用的字符编码是ASCII.- '0'不仅提高了可读性,而且放弃了ASCII假设,并且可以使用C语言规定的任何编码,C语言规定必须在连续的块中顺序编码数字字符.

另一方面,没有对字母作出这样的规定.因此,在您使用EBCDIC编码的罕见情况下,例如,映射'A'..'Z'0..25不再像减法一样简单'A',因为字母不是在EBCDIC中的连续块中按顺序编码的.

一些编程语言通过强制使用一个特定的编码来表示源代码来简化问题(例如,Java使用Unicode:JLS§3.1)

也可以看看

相关问题

  • 在这种情况下,指出"0"的+1会更清晰地写出"48".FWIW,使用"0"将使其在EBCDIC废话上工作(C保证数字的连续char值); 但是,您的"A"示例不适用于EBCDIC. (7认同)
  • @ShinTakezou,没有此属性的任何字符编码都不是C实现的允许编码。或者换句话说,使用这种编码的自称“ C实现”将不是“ C”。阅读标准。无论如何要等上一两年,ISO C最终会继续指定ASCII或(如果有运气的话)指定UTF-8。 (2认同)

Ada*_*mke 5

查找字符串s中的数字总和.

sum += s[i] - 48;ASCII字符转换为它们的数值.