2.3.6 类型的兼容性
一种类型的值一般不能存储到另一种类型的变量中。例如,大多数编译器会对以下语句报错:
- int int_variable;
- int_variable = 2.99;
这是因为类型不匹配。常量2.99是double类型,变量int_variable是int类型。遗憾的是,并非所有编译器都以相同的方式响应上述赋值语句。有的会显示一条错误消息,有的只是给出一条警告消息,有的编译器则完全无动于衷。然而,即使编译器允许这种赋值语句,但赋给变量int_variable的值可能是2,而非四舍五入之后的3。由于无法保证编译器允许这种赋值语句,所以要避免将double类型的值赋给int类型的变量。
将上述代码中的常量2.99用double类型的变量替换会出现同样的问题。对于以下赋值语句,大多数编译器都会报错:
- int int_variable;
- double double_variable;
- double_variable = 2.00;
- int_variable = double_variable;
虽然2.00无需四舍五入,但问题依然存在。2.00是double类型,而不是int类型。正如后文所述,可将对double_variable赋值时使用的2.00替换为2,但这样仍然无法让编译器正常赋值。变量int_variable和double_variable的类型不同,这才是关键。
即使编译器允许在赋值语句中混用不同类型,但大多数情况下都不应该这样做。这不利于程序的移植,而且会引起混淆。例如,如果编译器允许将2.99赋给int类型的变量,该变量获得的将是2,而不是2.99,这便产生了混淆,因为程序的意思是把2.99赋给变量。
一些特殊情况允许将一种类型的值赋给另一种类型的变量。将int类型的值赋给double类型的变量是允许的。例如,以下语句既是有效的,也是合乎情理的:
- double double_variable;
- double_variable = 2;
以上语句将double_variable变量的值设为2.0。
虽然不建议这样做,但确实可以将int值(如65)保存到char类型的变量中。另外,还可将字母(如'Z')保存到int类型的变量中。从多方面考虑,C语言将字符视为小整数值。遗憾的是,C++(www.cppentry.com)从C沿袭了这一点。之所以选择这样做,是因为char类型的变量占用的内存比int类型少。所以,用char类型的变量进行计算可以节省一些内存。不过,更清晰的方案是在操作整数时使用int类型,操作字符时使用char类型。
一般的规则是,不要将一种类型的值放到另一种类型的变量中--虽然违反这个规则的情况似乎多于遵守这个规则的情况。无论如何,即使编译器没有非常严格地贯彻这一规则,你也应该主动遵守它。将一种类型的数据放入另一种类型的变量中可能造成问题。因为值必须转换成相应类型的值,但转换后的值可能不是你所希望的。
bool类型的值可以赋给整数类型(short,int和long)的变量,整数也可以赋给bool类型的变量。但这样做不好,应尽量避免。考虑到知识的全面性,并帮助你阅读其他人写的代码,我们打算说具体一点:赋给bool类型的变量时,任何非零的整数都将保存为bool值true,值0则保存为bool值false。反之,将bool值赋给整数变量时,true作为1来存储,false则作为0来存储。