C中的字符数据类型

C中的字符数据类型,c,C,在C语言书中,char数据类型可以记忆数字和ascii字符。计算机如何知道我指的是一个字符还是一个数字?例如,如果我想在屏幕上打印char变量的值,计算机如何知道我是指那个数字的ascii字符,还是指那个数字 提前感谢。编译器不一定会自动处理此问题。在C语言中,这是通过格式说明符在控制台输出中处理的。 printf("This is a char:%c\n", 'c'); printf("This is an int:%d\n", 3); 如果提供了错误的数据类型作为与格式字符串中的格式说明符

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


提前感谢。

编译器不一定会自动处理此问题。在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
您可以在此处找到字符/数字映射:


您为
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.

根据《第二版》
第A4.2节“标识符的含义”:“基本类型”,第195页

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

因此,以下工作(如果是,即以下示例适用)


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

int
;转换为
无符号字符后的单个字符


您可以指出使用%d打印“c”将如何打印99,因为这是“c”的ascii值。谢谢!我明白了。:)但是在C++中,计算机如何知道字符是字符还是字符?在C++中,只将其转换为int。代码>代码,你觉得代码示例是OP的综合答案吗?你能在这里增加价值吗?@DaveA对不起,我在打电话,更新了…)
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