K&R 1.6 数组 // 数组结构中的数字表示
K&R 1.6 Arrays // Digit representation in an array construct
我找到了这个关于在 C 语言中使用数组的示例代码。
#include <stdio.h>
main () {
int c, i;
int ndigit[10];
for (i = 0; i < 10; ++i)
ndigit[i]=0;
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c - '0'];
printf("digits =");
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
}
我以前从未见过数组,但我想我明白了。
不过,我不确定为什么必须在 '..'
中插入数字值,也不确定为什么 i
的赋值必须表示为 c-'0'
.
这是书中的一段话,应该可以澄清我的疑惑:
This particolar program relies on the properties of the character representation of the digits. For example the text if (c >= '0' && c <= '9')
determines whether the characters in c
is a digit. If it is, the numeric value if that digit is c - '0'
.
我不明白这些值如果是字符怎么能用在算术表达式中,是因为它们映射到数值吗?
那么为什么整个程序如果像 if (c >= 0 && c <= 9)
那样写成数字就不能工作,如果 c
不是这样写的(我的理解是只是“任何数字 c
是负 0。
如果您看到 getchar()
的手册页,上面写着
....reads the next character from stdin and returns it as an unsigned char
cast to an int
....
因此,数字 [示例,9
] 的输入被视为 char
输入和相应的编码 [通常为 ASCII] 值由 getchar()
.
返回
现在回答你的问题,
why the digit values have to be inserted in '..'
A digit [或任何其他字符,就此而言],写为'.'
,表示相同的相应ASCII值。检查 ASCII table here.
为了便于理解,9
是 9
而 '9'
表示相应的 ASCII 57
.
why the assignment of i has to be expressed as c-'0'.
如果仔细观察ASCII table,可以看到,0
到9
对应的值是有顺序的。因此,要获得特定数字 作为 和 int
值,我们可以执行 c - '0'
与 c - 48
相同,这将为我们提供数字 作为一个int
.
I don't understand how can these values be used in arithmetical
expressions if they are characters, is it because they are mapped to
numerical values?
getchar()
returns字符read.Prototype为
int getchar(void)
读取一个字符时getchar()
returns读取字符的ASCII值。
char 的 0 到 9 的 ASCII 值是连续的。所以如果我们有
就利用它
char ch = '5';
int i = ch - '0'; /* 53 - 48 = 5 */
将为您提供整数值 5。将字符转换为整数。该算法通过隐式转换执行。
如果你有一个字符 '8' 那么这不会给你整数值 8
但会返回 ASCII 值 56。因此在算术 ch - '0'
期间因为两者都是 char 各自的 ASCII 值使用并执行算术运算
TL;DR: "char" 只是一个单字节长的整数。
I don't understand how can these values be used in arithmetical expressions if they are characters, is it because they are mapped to numerical values?
在 C 中,一个字符是 "smallest addressable unit of the machine that can contain basic character set. It is an integer type." [1]。通常,char 相当于 "a one-byte-long integer",因此它们可以保存从 0 到 (2^8)-1 或 [0,255] 的值。
话虽这么说,当你写作时
char c = '9';
你说的是 "c is a one-byte-long integer whose value is the character-set representation of the character 9"。通过查看最常见的字符集 ASCII table [2],我们看到字符 9 的整数值为 57,因此上面的表达式等同于
char c = 57;
要将数字的字符集值转换为数字本身(例如“9”转换为 9,或 57 转换为 9),您可以依赖 属性 字符集,数字始终按顺序存储并且越来越多地减去“0”的值,在 ASCII 中为 48,所以:
char c;
c = '9' - '0'; /* = 9 In any character set */
c = 57 - 48; /* = 9 */
c = '9' - 48; /* = 9 In ASCII */
c = 57 - '0'; /* = 9 In ASCII */
请记住,虽然 ASCII 是最常见的字符集,但这实际上取决于机器。
我找到了这个关于在 C 语言中使用数组的示例代码。
#include <stdio.h>
main () {
int c, i;
int ndigit[10];
for (i = 0; i < 10; ++i)
ndigit[i]=0;
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c - '0'];
printf("digits =");
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
}
我以前从未见过数组,但我想我明白了。
不过,我不确定为什么必须在 '..'
中插入数字值,也不确定为什么 i
的赋值必须表示为 c-'0'
.
这是书中的一段话,应该可以澄清我的疑惑:
This particolar program relies on the properties of the character representation of the digits. For example the text
if (c >= '0' && c <= '9')
determines whether the characters inc
is a digit. If it is, the numeric value if that digit isc - '0'
.
我不明白这些值如果是字符怎么能用在算术表达式中,是因为它们映射到数值吗?
那么为什么整个程序如果像 if (c >= 0 && c <= 9)
那样写成数字就不能工作,如果 c
不是这样写的(我的理解是只是“任何数字 c
是负 0。
如果您看到 getchar()
的手册页,上面写着
....reads the next character from stdin and returns it as an
unsigned char
cast to anint
....
因此,数字 [示例,9
] 的输入被视为 char
输入和相应的编码 [通常为 ASCII] 值由 getchar()
.
现在回答你的问题,
why the digit values have to be inserted in '..'
A digit [或任何其他字符,就此而言],写为'.'
,表示相同的相应ASCII值。检查 ASCII table here.
为了便于理解,9
是 9
而 '9'
表示相应的 ASCII 57
.
why the assignment of i has to be expressed as c-'0'.
如果仔细观察ASCII table,可以看到,0
到9
对应的值是有顺序的。因此,要获得特定数字 作为 和 int
值,我们可以执行 c - '0'
与 c - 48
相同,这将为我们提供数字 作为一个int
.
I don't understand how can these values be used in arithmetical expressions if they are characters, is it because they are mapped to numerical values?
getchar()
returns字符read.Prototype为
int getchar(void)
读取一个字符时getchar()
returns读取字符的ASCII值。
char 的 0 到 9 的 ASCII 值是连续的。所以如果我们有
就利用它char ch = '5';
int i = ch - '0'; /* 53 - 48 = 5 */
将为您提供整数值 5。将字符转换为整数。该算法通过隐式转换执行。
如果你有一个字符 '8' 那么这不会给你整数值 8
但会返回 ASCII 值 56。因此在算术 ch - '0'
期间因为两者都是 char 各自的 ASCII 值使用并执行算术运算
TL;DR: "char" 只是一个单字节长的整数。
I don't understand how can these values be used in arithmetical expressions if they are characters, is it because they are mapped to numerical values?
在 C 中,一个字符是 "smallest addressable unit of the machine that can contain basic character set. It is an integer type." [1]。通常,char 相当于 "a one-byte-long integer",因此它们可以保存从 0 到 (2^8)-1 或 [0,255] 的值。
话虽这么说,当你写作时
char c = '9';
你说的是 "c is a one-byte-long integer whose value is the character-set representation of the character 9"。通过查看最常见的字符集 ASCII table [2],我们看到字符 9 的整数值为 57,因此上面的表达式等同于
char c = 57;
要将数字的字符集值转换为数字本身(例如“9”转换为 9,或 57 转换为 9),您可以依赖 属性 字符集,数字始终按顺序存储并且越来越多地减去“0”的值,在 ASCII 中为 48,所以:
char c;
c = '9' - '0'; /* = 9 In any character set */
c = 57 - 48; /* = 9 */
c = '9' - 48; /* = 9 In ASCII */
c = 57 - '0'; /* = 9 In ASCII */
请记住,虽然 ASCII 是最常见的字符集,但这实际上取决于机器。