car*_*los 11 c casting type-conversion
如果我宣布:
int i = 0 + 'A';
Run Code Online (Sandbox Code Playgroud)
是'A'考虑char还是int?
有些人可能会使用:
int i = 0 + (int)'A';
Run Code Online (Sandbox Code Playgroud)
但这真的有必要吗?
Kei*_*son 14
在C中,字符常量如'A'类型int.在C++中,它们属于类型char.
在C中,字符常量的类型很少重要.它保证是int,但如果改变了语言char,大多数现有代码将继续正常工作.(显式引用的代码sizeof 'A'会改变行为,但除非你试图区分C和C++,并且有更好和更可靠的方法来做到这一点,所以写作没有多大意义.有些情况涉及宏sizeof 'A'可能在哪里明智的;我不会在这里详细介绍.)
在您的代码示例中:
int i = 0 + 'A';
Run Code Online (Sandbox Code Playgroud)
0是类型的int,并且+如果需要,将两个操作数提升为公共类型,因此行为完全相同.即使这样:
char A = 'A';
int i = 0 + A;
Run Code Online (Sandbox Code Playgroud)
做同样的事情,用A(这是类型char)被晋升为int.类型的表达char通常(但并非总是)被隐式地提升为int.
在C++中,字符常量是类型char- 但适用相同的促销规则.当Stroustrup设计C++时,他改变了字符常量的类型以保持一致性(这A无疑是类型有点令人惊讶int),并且能够实现更一致的重载(C不支持).例如,如果C++字符常量是类型int,那么:
std::cout << 'A';
Run Code Online (Sandbox Code Playgroud)
将打印65,ASCII值'A'(除非系统使用EBCDIC); 打印更有意义A.
int i = 0 + (int)'A';
Run Code Online (Sandbox Code Playgroud)
在C和C++中都不需要强制转换.在C中,'A'已经是类型int,因此转换无效.在C++中,它是类型的char,但是如果没有强制转换,它将被隐式转换为int无论如何.
在C和C++中,演员都应该怀疑.两种语言都在许多上下文中提供隐式转换,这些转换通常做正确的事情.显式强制转换可以覆盖隐式转换,也可以创建不会发生的转换.在许多(但并非全部)情况下,强制转换表示通过使用语言提供的隐式转换或通过更改声明来更好地解决问题,因此首先转换的东西是正确的类型.
(正如Pascal Cuoq在评论中提醒我的那样,如果plain char是无符号的并且宽泛int,那么类型的表达式char将被提升为unsigned int,而不是int.这只有CHAR_BIT >= 16在实现具有16位或更大字节的情况下才会发生,而如果sizeof (int) == 1,且如果纯char是无符号的我不知道,任何这样的实现确实存在,但据我所知,C编译器的一些.DSP的也有CHAR_BIT > 8.)
Gri*_*han 10
在C中,'A'type是int(不是char).我认为有些人int i = 0 + (int)'A';用C++ 做(或者使代码在C++/C中都有用).