如果字符常量是`int'类型,为什么它们被分配给`char`类型的变量?

时间:2015-12-10 02:58:13

标签: c types

C11标准表示字符常量(例如'x')的类型为int,而不是char。这令我感到惊讶和困惑(特别是作为一个相对初学者)。我遇到了这个答案Why are C character literals ints instead of chars?,这有点清楚了,但仍然让我想知道为什么它似乎是常规练习(至少在我遇到的所有书籍和教程中)为变量分配字符常量被声明为char类型的。例如,我们为什么要这样做

char initial = 's';

而不是

int initial = 's';

然后,当int类型的常量被赋值给char类型的变量时会发生什么?它是否已切换为char类型?

3 个答案:

答案 0 :(得分:4)

字符文字属于Vote类型的事实只是故事的一半。另一半是它们的值在int范围内。这很关键,因为如果你指定

char

你没有得到任何警告,但如果你这样做

char a = 65;
你得到一个警告。

  

我们为什么要char b = 56789; 而不是char initial = 's'

这可以让您在将变量分配给int initial = 's'类型的另一个变量或char数组的元素时避免强制转换:

char[]

当您需要使用char str[2]; str[0] = initial; // no cast when "initial" is of type "char" 存储int变量时,有一种情况 - 当您使用char / getc功能时,结果必须为{{ 1}},而不是fgetc,以便与int进行比较。

答案 1 :(得分:2)

考虑float x = 3.0;这会将double 3.0设置为float。代码可能是float x = 3.0f;。最终结果是一样的。

char ch = 5;相同。 vs char ch = (char)5;在这两种情况下,ch都会获得相同的值。

最后,考虑C最初专注于类型intdouble - 这就是它。 floatshortcharlong等类型只是偏离真正核心类型的C.(偶数unsigned,{{ 1}}是事后的事。)

  

当将类型为int的常量赋给char类型的变量时会发生什么?它是否切换为char型?

常数仍然是它的类型。将bool类型的常量赋给int不会更改常量的类型。如果原始char值超出int范围,然后保存在int中,char的值就会发生变化。

答案 2 :(得分:1)

如果为int变量分配了char值,则该值将转换为char类型。

声明变量char而不是int的原因有几个。一种是节省内存(尽管在数组或其他聚合中使用时更为相关)。另一个是明确表示它旨在保持char值。另一种是隐含地限制其价值范围。在某些情况下,您可能希望使用其地址获取char *,在这种情况下,您将无法使用int变量。