如果我声明了这个:
int i = 0 + 'A';
'A'
被认为是char
还是int
?
有些人可能会使用:
int i = 0 + (int)'A';
但这真的有必要吗?
如果我声明了这个:
int i = 0 + 'A';
'A'
被认为是char
还是int
?
有些人可能会使用:
int i = 0 + (int)'A';
但这真的有必要吗?
'A'
这样的字符常量的类型是 int
。而在 C++ 中,它们的类型是 char
。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';
输出'A'
的ASCII值为65
(除非系统使用EBCDIC),输出A
更为合理。
int i = 0 + (int)'A';
在C和C++中,强制类型转换通常是不必要的。在C中,'A'
已经是int
类型,因此转换没有效果。在C++中,它是char
类型,但是即使没有强制类型转换,它也会被隐式地转换为int
类型。char
是无符号的,并且与int
一样宽,则char
类型的表达式将被提升为unsigned int
,而不是int
。这只有在CHAR_BIT >= 16
的情况下才会发生,即如果实现具有16位或更大的字节,并且sizeof(int) == 1
,并且普通的char
是无符号的。我不确定是否实际存在这样的实现,尽管我了解某些DSPs的C编译器确实具有CHAR_BIT > 8
。)+
运算符不同,强制类型转换运算符不会提升其参数;在C++中,(int)'A'
确实将操作数从char
转换为int
。(在许多但不是所有情况下;无论如何都会发生转换;在char c ='A';
中,没有提升。) - Keith Thompsonchar c = 'A'
也会违反这个规则。 - Keith Thompsonchar x = ..., y = ...; x = y;
,y
的值不会被提升为 int
,然后再转换回 char
;它只是作为 char
赋值。重点是 C 不要求支持对比 int
更窄的类型进行算术操作;但其他操作是必需的。 - Keith Thompson'A'
类型是 int
(而不是 char)。我认为有些人在 C++ 中执行 int i = 0 + (int)'A';
(或者让代码同时适用于 C++/C)。 char c = 'c'; /* 'c' is int, but (c == 'c') is true */
int
?”这两个问题完全不同。回答“为什么一些C标准库函数返回一个int
?”的问题涉及到类型unsigned char
。你的回答对于任何一个问题都没有意义。 - Pascal Cuoq
'A'
是char
类型,强制转换在大多数平台上也没有影响。准确地说,如果'A'
是有符号的char
类型(无论是signed char
还是带符号的char
),就永远不会有任何区别;如果A
是无符号的char
类型(无论是unsigned char
还是无符号的char
),那么int
和char
必须具有相同的大小才能看到差异。 - Pascal Cuoq0 +
有什么用?即使在0 + 'A'
中,它也没有作用,甚至在0 + (int)'A'
中作用更小。 - Jens Gustedt'A'
是一个int
。C99 6.4.4.4:10 “整型字符常量的类型为 int。” - Pascal Cuoq