隐式转换
类型系统帮助我们识别数据,是 C 语言非常重要的部分。但作为一个强类型的语言,比起显式的类型转换,C 语言程序中却更多充斥着隐式转换(implicit conversion)。这样的转换,在悄无声息间发生,为程序员对程序的编写和识别带来了很大的便利,也造成了很大的困扰。
在开始之前,我们先了解一个事实:在 C 语言里面,字符常量是int
类型的,而 C++ 里才是char
类型的。假设int
有 32 位,那么
printf("%zu", sizeof 'a'); // C 输出 4,C++ 输出 1
这里不是什么隐式转换所致,它本来就是这样。请勿与后面讲到的提升混淆。
转换情形
隐式转换包括以下三类:
- 赋值、初始化、传参、返回,称为如同赋值的转换。
- 可变参数提升。
- 算术转换(提升、共同类型)。
这里第一类里面说的传参特制的带类型的参数的传参(如printf
的第一个参数),对于不带类型的可变参数(如printf
的后续参数)是算作第二类里的。同样的,算术运算中的提升算作第三类,而可变参数中的提升算作第二类。
下面我具体说说哪些是值得注意的。