C11标准表示字符常量(例如'x'
)的类型为int
,而不是char
。这令我感到惊讶和困惑(特别是作为一个相对初学者)。我遇到了这个答案Why are C character literals ints instead of chars?,这有点清楚了,但仍然让我想知道为什么它似乎是常规练习(至少在我遇到的所有书籍和教程中)为变量分配字符常量被声明为char
类型的。例如,我们为什么要这样做
char initial = 's';
而不是
int initial = 's';
然后,当int
类型的常量被赋值给char
类型的变量时会发生什么?它是否已切换为char
类型?
答案 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最初专注于类型int
和double
- 这就是它。 float
,short
,char
,long
等类型只是偏离真正核心类型的C.(偶数unsigned
,{{ 1}}是事后的事。)
当将类型为int的常量赋给char类型的变量时会发生什么?它是否切换为char型?
常数仍然是它的类型。将bool
类型的常量赋给int
不会更改常量的类型。如果原始char
值超出int
范围,然后保存在int
中,char
的值就会发生变化。
答案 2 :(得分:1)
如果为int
变量分配了char
值,则该值将转换为char
类型。
声明变量char
而不是int
的原因有几个。一种是节省内存(尽管在数组或其他聚合中使用时更为相关)。另一个是明确表示它旨在保持char
值。另一种是隐含地限制其价值范围。在某些情况下,您可能希望使用其地址获取char *
,在这种情况下,您将无法使用int
变量。