11

如果我声明:

int i = 0 + 'A';

'A'考虑char还是int

有些人可能会使用:

int i = 0 + (int)'A';

但这真的有必要吗?

4

3 回答 3

14

在 C 中,字符常量如'A'. int在 C++ 中,它们的类型是char.

在 C 中,字符常量的类型并不重要。可以保证int,但如果更改语言以使其成为char,大多数现有代码将继续正常工作。(明确引用的代码sizeof 'A'会改变行为,但除非您试图区分 C 和 C++,否则编写该代码并没有多大意义,并且有更好、更可靠的方法来做到这一点。有些情况下sizeof 'A'可能会涉及宏明智的;我不会在这里详细说明。)

在您的代码示例中:

int i = 0 + 'A';

0is 的 type int,如果需要的话,of 的两个操作数+被提升为一个公共类型,所以无论哪种方式,行为都是完全相同的。即使这样:

char A = 'A';
int i = 0 + A;

做同样的事情,将A(类型为char提升为int. 类型表达式char通常但不总是隐式提升为int.

在 C++ 中,字符常量是类型的char——但同样的提升规则也适用。当 Stroustrup 设计 C++ 时,他更改了字符常量的类型以保持一致性(承认Atype有点令人惊讶int),并启用更一致的重载(C 不支持)。例如,如果 C++ 字符常量的类型为int,那么:

std::cout << 'A';

将打印65ASCII 值'A'(除非系统使用 EBCDIC);打印它更有意义A

int i = 0 + (int)'A';

在 C 和 C++ 中都不需要强制转换。在 C 中,'A'已经是 type int,所以转换没有效果。在 C++ 中,它是 type char,但如果没有强制转换,它int无论如何都会被隐式转换为。

在 C 和 C++ 中,应该以怀疑的态度看待强制转换。两种语言都在许多上下文中提供隐式转换,并且这些转换通常做正确的事情。显式转换要么覆盖隐式转换,要么创建否则不会发生的转换。在许多(但绝不是全部)情况下,强制转换表示问题可以通过使用语言提供的隐式转换或通过更改声明来更好地解决,以便被转换的东西首先是正确的类型。

(正如 Pascal Cuoq 在评论中提醒我的那样,如果 plainchar是无符号的并且与一样宽int,那么类型的表达式char将被提升为unsigned int,而不是int。只有当 时才会发生这种情况CHAR_BIT >= 16,即,如果实现具有 16 位或更大的字节,ifsizeof (int) == 1和if plain是char符号的。我不确定是否真的存在任何这样的实现,尽管我知道某些DSP的 C 编译器确实有CHAR_BIT > 8。)

于 2013-08-24T20:41:05.177 回答
10

在 C 中,'A'类型是int(不是字符)。我认为有些人int i = 0 + (int)'A';在 C++ 中做(或使代码在 C++/C 中都有用)。

于 2013-08-24T20:08:35.493 回答
0

根据标准 ISO C99,C 中文字字符的类型是int.

但是,文字字符(如“c”)具有适合 a 的范围char
因此,您可以将文字字符分配给char变量而不会丢失信息。

 char c = 'c'; /* 'c' is int, but (c == 'c') is true */
于 2013-08-24T22:23:43.073 回答