C 为什么是';0';将字符串转换为数字时减法?

C 为什么是';0';将字符串转换为数字时减法?,c,C,我是C语言的新手,我在C语言中寻找一个可以将字符串转换成整数的自定义函数,我遇到了这个算法,除了一个部分外,它非常有意义。-'0'在这一行上到底做了什么n=n*10+a[c]-'0' int toString(char a[]) { int c, sign, offset, n; if (a[0] == '-') { // Handle negative integers sign = -1; } if (sign =

我是C语言的新手,我在C语言中寻找一个可以将字符串转换成整数的自定义函数,我遇到了这个算法,除了一个部分外,它非常有意义。
-'0'
在这一行上到底做了什么
n=n*10+a[c]-'0'

    int toString(char a[]) {
      int c, sign, offset, n;

      if (a[0] == '-') {  // Handle negative integers
        sign = -1;
      }

      if (sign == -1) {  // Set starting position to convert
        offset = 1;
      }
      else {
        offset = 0;
      }

      n = 0;

      for (c = offset; a[c] != '\0'; c++) {
        n = n * 10 + a[c] - '0';
      }

      if (sign == -1) {
        n = -n;
      }

      return n;
    }

该算法没有我找到它的地方的解释。

假设
x
的值在
'0'
'9'
之间,
x-'0'
产生一个介于
0
9
之间的值。因此
x-'0'
基本上将十进制数字字符常量转换为其数值整数值(例如,
'5'
转换为
5


C说
'0'
'9'
是实现定义的值,但是C也保证
'0'
'9'
是顺序值。

假设
x
的值在
'0'
'9'
之间,
x-'0'
产生一个介于
0
9
之间的值。因此
x-'0'
基本上将十进制数字字符常量转换为其数值整数值(例如,
'5'
转换为
5


C说
'0'
'9'
是实现定义的值,但C也保证
'0'
'9'
是顺序值。

减去
'0'
的原因是十进制数字的字符码点是从
'0'
开始顺序排列的,没有间隙。换句话说,
'5'
的字符代码大于
'0'
的字符代码5;
'6'
的字符代码大于
'0'
的字符代码6,依此类推。因此,从另一个数字的代码中减去零的代码
'0'
,就会产生相应数字的值

这种安排对于ASCII码、EBSDIC码、十进制数字的UNICODE码等都是正确的。对于ASCII代码,数字代码如下所示:

'0' 48
'1' 49
'2' 50
'3' 51
'4' 52
'5' 53
'6' 54
'7' 55
'8' 56
'9' 57

减法
'0'
有效的原因是十进制数字的字符代码点从
'0'
开始顺序排列,没有间隙。换句话说,
'5'
的字符代码大于
'0'
的字符代码5;
'6'
的字符代码大于
'0'
的字符代码6,依此类推。因此,从另一个数字的代码中减去零的代码
'0'
,就会产生相应数字的值

这种安排对于ASCII码、EBSDIC码、十进制数字的UNICODE码等都是正确的。对于ASCII代码,数字代码如下所示:

'0' 48
'1' 49
'2' 50
'3' 51
'4' 52
'5' 53
'6' 54
'7' 55
'8' 56
'9' 57

请参阅-注意数字字符的关系(和值)
'0'
的值为48,
'\0'
的值为0是NUL。请参阅-注意数字字符的关系(和值)
'0'
的值为48,
'\0'
的值为0是NUL。对不起,我仍然不理解这一点,而且是
x
n
在这种情况下?@Bridenstine这里
x
将是
a[c]
在你的程序中抱歉,我仍然不理解这一点,并且是
x
n
在这种情况下?@Bridenstine这里
x
将是
a[c]
在你的程序中