3

在一本 C 书中说 char 数据类型可以记住数字和 ascii 字符。计算机如何知道我指的是字符还是数字?例如,如果我想在屏幕上打印一个 char 变量的值,计算机如何知道我是引用那个数字的 ascii 字符还是引用那个数字?

提前致谢。

4

3 回答 3

3

编译器不一定会自动处理这个问题。在 C 中,这是通过格式说明符在控制台输出中处理的。

printf("This is a char:%c\n", 'c');
printf("This is an int:%d\n", 3);

如果您提供错误的数据类型作为与格式字符串中的格式说明符对应的参数,您将收到编译器警告:

printf("This is a char:%c\n", 1); // WARNING: Implicit conversion from (int) to (char) (due to implicit down-cast)

如果您提供的参数小于预期值,您可能不会收到这样的编译器警告,具体取决于详细程度,即:

printf("This is an int:%d\n", 'b'); // Implicit up-cast

因此,简而言之,格式说明符让编译器在将数据打印到控制台时知道如何表示数据,并且如果存在不匹配,还将在格式说明符和相应的参数之间进行类型检查。

最后,如果您的编译器符合 C99,如果您有类型不匹配, printf 会将整数转换为其等效的字符文字:

printf("This is a char:%c\n", 99); // Prints the 'c' character literal

您可以在此处找到字符/数字映射:

http://www.asciitable.com/

于 2013-11-05T17:55:46.407 回答
2

根据The C Programming Language ”,第 2 版,
第 A4.2 节“标识符的含义”:“基本类型”,第 195 页

声明为字符 ( char) 的对象大到足以存储执行字符集的任何成员。如果该集合中的真正字符存储在char对象中,则其值等于该字符的整数代码,并且是非负数。

因此,以下工作(如果字符集ASCII,即以下示例适用于ASCII

int n = 65; //is equal to 'A' in ASCII
char c = 'A'; //is equal to 65 in ASCII
printf("%c %d", n, c); //should print "A 65" despite the "wrong" order

根据第 244 页,“标准库”、“格式化输出”、“printf函数”
对于 '%c' 格式说明符,printf 执行以下操作:转换intunsigned char

int; 单个字符,转换为unsigned char.

于 2013-11-05T17:57:34.950 回答
1

你给格式printf()

如果您使用:

char c = 'c';
printf("%c \n", c); //result is the character 'c'.
printf("%d \n", c); //result is 99, the ASCII value of character 'c'.

但请注意不要在 scanf 中为 char 使用格式 %d,这可能会破坏您的堆栈。

scanf("%d \n", &c); //NEVER do this.
于 2013-11-05T17:57:28.393 回答