我有一个char数组:
char arr[5];
说我给它分配值:
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
使用时打印:
printf("%c\n", arr[0])
没有打印出任何内容(只有换行符)。
使用时打印:
printf("%d\n", arr[0])
打印出值1(和换行符)。
为什么会这样?将char变量赋值为整数时究竟发生了什么?是铸造了吗?
答案 0 :(得分:1)
数字1
与字符'1'
具有不同的ASCII值,即49。
当您使用%c
时,它会将其视为ASCII字符。
如果您使用字符而不是数字初始化数组,那么您将看到您对
的期望printf("%c\n", arr[0])
即
arr[0] = '1';
arr[1] = '2';
arr[2] = '3';
arr[3] = '4';
arr[4] = '5';
答案 1 :(得分:0)
字符代码1-5是不可打印的控制字符, Control-A 到 Control-E 。
以下代码:
#include <stdio.h>
int main(void)
{
char arr[5];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
for (int i = 0; i < 5; i++)
printf("%c\n", arr[i]);
return 0;
}
可以编译成程序ccc
,然后运行:
$ ccc
$ ccc | odx
0x0000: 01 0A 02 0A 03 0A 04 0A 05 0A ..........
0x000A:
$ ccc | od -c | so
0000000 001 \n 002 \n 003 \n 004 \n 005 \n
0000012
$ ccc | sed l
\001$
\002$
\003$
\004$
\005$
$
虽然值1-5没有可见字符(控制字符在终端上没有可见的表示),但是十六进制转储程序(odx
,一个家庭酿造程序),{{1} }和od -c
都看到输出中的控制字符。
如果您想查看sed l
到'1'
的数字,请使用单引号字符常量代替(未引用的)数字。
顺便提一下,在电话中:
'5'
printf("%c\n", arr[0]);
printf("%d\n", arr[0]);
会被调用variadic(变量参数列表)函数(如arr[0]
)的标准规则自动提升为int
。参数列表变量部分中printf()
类型的所有参数(包括有符号和无符号变量)和char
将自动提升为short
,并且int
类型的任何值被提升为float
。 (可以想象,如果普通double
无法存储最大unsigned short
值,unsigned int
可以提升为int
,但这意味着unsigned short
如此无论如何,促销都是无操作的。现在我已经覆盖了我的屁股,你可以忘掉它。)格式字符串中的转换规范控制着sizeof(short) == sizeof(int)
值如何呈现给用户。< / p>