将字符分配和比较为整数

时间:2014-09-02 15:33:58

标签: c arrays char int

我有一个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变量赋值为整数时究竟发生了什么?是铸造了吗?

2 个答案:

答案 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>