C中的文字字符:它是int还是char?
Posted
技术标签:
【中文标题】C中的文字字符:它是int还是char?【英文标题】:literal character in C: is it an int or a char? 【发布时间】:2013-08-27 16:12:23 【问题描述】:如果我这样声明:
int i = 0 + 'A';
'A'
被认为是 char
还是 int
?
有些人可能会使用:
int i = 0 + (int)'A';
但这真的有必要吗?
【问题讨论】:
不需要后者。字符文字的类型为int
。
即使'A'
的类型是char
,除了最奇特的平台外,演员表对所有平台都没有影响。准确地说,如果'A'
是有符号字符类型(signed char
或char
,当它被签名时),则永远不会有任何区别,如果A
是无符号char
类型(@ 987654334@ 或 char
(未签名时),那么 int
和 char
必须具有相同的大小才能显示差异。
0 +
有什么用?即使在0 + 'A'
中,它也毫无用处,甚至更少:) 在0 + (int)'A'
中。
'A'
是 char
,char
是数字类型。根据标准 C 转换规则,当在二元运算符上与 int
配对时,它将被隐式转换为 int
。
@HotLicks 'A'
是一个int
。 C99 6.4.4.4:10 “整数字符常量的类型为 int。”
【参考方案1】:
根据标准 ISO C99,C 中文字字符的类型是int
。
但是,文字字符(例如“c”)具有适合 char
的范围。
因此,您可以将文字字符分配给char
变量而不会丢失信息。
char c = 'c'; /* 'c' is int, but (c == 'c') is true */
【讨论】:
您将这里的问题与另一个问题“为什么某些标准库函数在 C 中返回int
?”混淆了。这两个问题完全不同。 “为什么某些标准库函数在 C 中返回 int
?”这个问题的答案涉及类型unsigned char
。您的回答对任何一个问题都没有意义。
我删除了 EOF 段落。我认为其余的都很好。【参考方案2】:
在 C 中,'A'
等字符常量的类型为 int
。在 C++ 中,它们的类型为 char
。
在 C 中,字符常量的类型并不重要。保证为int
,但如果将语言更改为char
,大多数现有代码将继续正常工作。 (明确引用sizeof 'A'
的代码会改变行为,但除非您试图区分 C 和 C++,否则编写该代码并没有多大意义,并且有更好、更可靠的方法来做到这一点。有些案例涉及宏其中sizeof 'A'
可能是明智的;我不会在这里详细说明。)
在您的代码示例中:
int i = 0 + 'A';
0
是int
类型,如果需要,+
的两个操作数被提升为一个公共类型,因此无论哪种方式的行为都是完全相同的。即使这样:
char A = 'A';
int i = 0 + A;
做同样的事情,将A
(是类型为char
)提升为int
。 char
类型的表达式通常但不总是隐式提升为 int
。
在 C++ 中,字符常量的类型为 char
——但同样的提升规则适用。当 Stroustrup 设计 C++ 时,他更改了字符常量的类型以保持一致性(诚然,A
的类型为 int
有点令人惊讶),并启用更一致的重载(C 不支持)。例如,如果 C++ 字符常量的类型为 int
,那么:
std::cout << 'A';
将打印65
,'A'
的 ASCII 值(除非系统使用 EBCDIC);打印A
更有意义。
int i = 0 + (int)'A';
在 C 和 C++ 中都不需要强制转换。在 C 中,'A'
已经是 int
类型,因此转换无效。在 C++ 中,它的类型是 char
,但如果没有强制转换,它将被隐式转换为 int
。
在 C 和 C++ 中,应该以怀疑的态度看待强制转换。两种语言在许多情况下都提供隐式转换,并且这些转换通常会做正确的事情。显式转换要么覆盖隐式转换,要么创建否则不会发生的转换。在许多(但绝不是全部)情况下,强制转换表示问题可以通过使用语言提供的隐式转换或通过更改声明来更好地解决,以便被转换的东西首先是正确的类型。
(正如 Pascal Cuoq 在 cmets 中提醒我的那样,如果纯 char
是无符号的并且与 int
一样宽,那么 char
类型的表达式将被提升为 unsigned int
,不是int
。只有在CHAR_BIT >= 16
时才会发生这种情况,即,如果实现具有16 位或更大的字节,and if sizeof (int) == 1
,and if普通的char
是无符号的。我不确定是否真的存在任何这样的实现,尽管我知道某些DSPs 的C 编译器确实有CHAR_BIT > 8
。)
【讨论】:
你的推荐信是什么?如此准确而美丽的答案!你是老师吗? “在 C++ 中,它是 char 类型,但如果没有强制转换,它将被隐式转换为 int” 你知道我要说什么,不是吗?好吧,我就不说了。 MISRA C 委员会放弃了他们的集体立场,而不是没有隐式转换,现在许多行业都使用 MISRA C 进行质量检查。 @SteveBarnes 谁在这里谈论转换?'A'
的类型为 int
。 0
的类型为 int
。在 C++ 中,'A'
的类型为 char
,其变为 int
类型是一种促销,这是不可避免的。如果你写(int)'A'
,那么'A'
在演员之前被提升为int
。例如,参见 C99 标准中的 6.3.1.1。
你需要阅读6.3的开头,以及脚注。您引用的句子仅适用于发生 integer Promotion 的上下文。强制转换的操作数不是这些上下文之一。同理,在一个赋值:char x = ..., y = ...; x = y;
中,y
的值不会提升为int
,然后再转换回char
;它只是分配为char
。关键是 C 不需要支持对小于 int
的类型的 算术 操作;需要其他操作。【参考方案3】:
在 C 中,'A'
类型是 int
(不是字符)。我认为有些人会在 C++ 中使用 int i = 0 + (int)'A';
(或者让代码在 C++/C 中都有用)。
【讨论】:
在 C++ 中'A'
是 char
(不是 int
):尝试 sizeof('A'), sizeof(int), sizeof(char)
在 C++ 和 C 中。
@carlos 有人可能会这样做,因为他们不知道'A'
在 C 中是 int。退出可能(强制转换是多余的,因为即使在 C++ 中也有隐式强制转换)
@carlos 代表 C code 和 C++ code以上是关于C中的文字字符:它是int还是char?的主要内容,如果未能解决你的问题,请参考以下文章