在C书中说char数据类型可以记住数字和ascii字符。计算机如何知道我是指一个角色还是一个数字?例如,如果我想在屏幕上打印char变量的值,计算机如何知道我是否引用该数字的ascii字符,或者我引用该数字?
提前致谢。
答案 0 :(得分: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
您可以在此处找到字符/数字映射:
答案 1 :(得分:2)
根据到“The C Programming Language”,第2版,
第A4.2节“标识符的含义”:“基本类型”,第195页
声明为字符(
char
)的对象足以存储执行字符集的任何成员。如果该集合中的真实字符存储在char
对象中,则其值等于该字符的整数代码,并且是非负数。
因此,以下工作(如果character set为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
后的单个字符。
答案 2 :(得分: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.