El siguiente código es del libro de texto de K&R, página número 71:
val =10.0*val+s[i] -'0' ¿Qué significa s[i] -'0' aquí?
Parece que s es una matriz de caracteres o un puntero al primer elemento de una matriz de caracteres. Y el elemento s[i] contiene un carácter que representa un dígito como, por ejemplo '5' . Para convertir este carácter que por ejemplo en ASCII tiene código interno igual a 53 (mientras que el código interno del carácter '0' es 48) se utiliza la expresión
s[i] -'0'eso es equivalente a
53 - 48 e igual al número 5
Según el Estándar C (5.2.1 Juegos de caracteres)
3... Tanto en el juego de caracteres básicos de origen como en el de ejecución, el valor de cada carácter después del 0 en la lista anterior de dígitos decimales será uno mayor que el valor del anterior.
Así que en ASCII hay una relación
Valor del código de carácter
'0' - 48 '1' - 49 '2' - 50 '3' - 51 '4' - 52 '5' - 53 '6' - 54 '7' - 55 '8' - 56 '9' - 57 Por ejemplo en EBCDIC los códigos internos de caracteres que representan dígitos son 240 - 249 (0-9) o en notación hexadecimal F0 - F9 .
Por lo tanto, es una forma estándar de obtener un dígito numérico de un carácter, independientemente del conjunto de caracteres utilizado.
char un int en forma de caracteres en un int real.
Por ejemplo, si s[i] es '9' entonces s[i] - '0' producirá 9 .
Probablemente el código se usa para convertir una cadena con dígitos decimales en el número representado (por ejemplo, "1234" en 1234).
s[i] es el dígito actual, s[i]-'0' es el valor numérico del dígito actual (por ejemplo, '9' se convierte en 9).
El resto del código C es simplemente cómo funcionan los sistemas numéricos posicionales.