C语言中的char数据类型

3
在一本C语言书中提到,char数据类型可以存储数字和ASCII字符。计算机如何知道我是引用了一个字符还是一个数字?例如,如果我想在屏幕上打印一个char变量的值,计算机如何知道我是指该数字的ASCII字符还是该数字本身?
谢谢。
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/

1
你可以指出使用 %d 打印 'c' 会打印出 99,因为这是 'c' 的 ASCII 值。 - Charlie Burns

2
根据《C程序设计语言》第二版,第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函数执行以下操作:将int转换为unsigned char

int;单个字符,在转换为unsigned char之后。


您觉得代码示例对于提问者来说是全面的回答吗?您可以在此处添加价值吗? - Dave Alperovich
@DaveA 对不起,我当时在用手机,已经更新了... ;) - Joe DF

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中使用%d格式来读取char类型的数据,这可能会破坏您的堆栈。
scanf("%d \n", &c); //NEVER do this.

谢谢!我明白了 :) 但在C++中,计算机如何判断打印时的字符是数字还是字母呢? - user2956608
在C++中,只需将字符强制转换为整数即可。cout<<c;会打印字符,cout<<(int)c;会打印ASCII值。 - SHR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接