如果我宣布:
int i = 0 + 'A';
'A'
是char
还是int
?
int i = 0 + (int)'A';
但这真的有必要吗?
答案 0 :(得分:14)
在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
,ASCII值为'A'
(除非系统使用EBCDIC);它打印A
更有意义。
int i = 0 + (int)'A';
在C和C ++中都不需要强制转换。在C中,'A'
已经是int
类型,因此转换无效。在C ++中,它的类型为char
,但如果没有强制转换,它无论如何都会隐式转换为int
。
在C和C ++中,演员应该怀疑。两种语言都在许多上下文中提供隐式转换,而这些转换通常做正确的事情。显式强制转换可以覆盖隐式转换,也可以创建不会发生的转换。在许多(但并非全部)的情况下,强制转换表示通过使用语言提供的隐式转换或通过更改声明来更好地解决问题,以便首先转换的东西是正确的类型。 / p>
(正如Pascal Cuoq在评论中提醒我的那样,如果char
未签名且与int
一样宽,那么char
类型的表达式将是提升为unsigned int
,而不是int
。仅当CHAR_BIT >= 16
,即实现具有16位或更大字节,和 {{}时,才会发生这种情况。 {1}},和如果普通sizeof (int) == 1
是无符号的。我不确定任何此类实现是否确实存在,但我知道某些DSPs的C编译器确实存在char
。)
答案 1 :(得分:10)
在C中,'A'
类型为int
(不是char)。我认为有些人在C ++中做int i = 0 + (int)'A';
(或者使代码在C ++ / C中都有用)。
答案 2 :(得分:0)
根据标准ISO C99,C中文字字符的类型为int
。
但是,字面字符(如“c”)的范围适合char
因此,您可以将文字字符分配给char
变量而不会丢失信息。
char c = 'c'; /* 'c' is int, but (c == 'c') is true */