电流=电流*10+;(c-';0';);

电流=电流*10+;(c-';0';);,c,input,C,Input,我试图通过这段代码读取未知数量的整数: while (1) { int c = getchar (); if (c == EOF) break; else if (isdigit (c)) current = current * 10 + (c - '0'); else { total += current; current = 0;

我试图通过这段代码读取未知数量的整数:

while (1) {
        int c = getchar ();
        if (c == EOF)
            break;
        else if (isdigit (c))
            current = current * 10 + (c - '0');
        else {
            total += current;
            current = 0;
        }
}

我知道什么
current=current*10+(c-“0”)
;但是我不知道为什么会有
c-'0'
。你能给我解释一下吗?提前感谢。

c-“0”是将单个ASCII数字转换为整数的基本方法

例如,如果
c
等于
'9'
,则其整数值为
0x39
'0'
的ASCII值是
0x30
,因此,
0x39-0x30==0x09
,它等于整数值
9

以下是数字的ASCII表:

chr  hex   dec
'0'  0x30  48
'1'  0x31  49
'2'  0x32  50
'3'  0x33  51
'4'  0x34  52
'5'  0x35  53
'6'  0x36  54
'7'  0x37  55
'8'  0x38  56
'9'  0x39  57

字符
'0'
没有ASCII值0。但是,幸运的是,字符
'1'
确实具有ASCII值
'0'+1
,依此类推,直到2、3、4、5、6、7、8和9。因此(伪码)
'n'-'0'==n
适用于每个数字。

数字在ASCII中通过增加值表示:
0
为48,
1
为49,依此类推。由于
C
中的字符只是伪装的整数,因此可以从任何其他数字中减去
0
的ASCII值以获得该数字的数值。例如,
'1'-'0'
49-48
相同,后者是
1

C指定10位十进制数字,这一点毫不奇怪,如下所示:

0123456789

C11§5.2.1进一步规定,“在源和执行基本字符集中,上述十进制数字列表中0后的每个字符的值应比前一个字符的值大一个

因此,当评估字符串中的数字字符时,该语言保证从十进制数字
char
中减去
'0'
将得到其整数值

if (isdigit (c))
  int value = c - '0';

这不依赖于使用ASCII的字符。

旁注:当前字符在您的代码中没有初始化。@hivert它可以在
while
循环上方初始化。顺便说一句,数字字符转到
'0'、'1'、…'9'
并不是特定于ASCII的:它在EBCDIC中也有效,事实上是由C标准强制规定的。很抱歉吹毛求疵,但
'n'-'0'
是常量,等于
62
(至少在ASCII中)。