《C编程技巧:117个问题解决方案示例 》 —1.9 隐式类型转换

举报
华章计算机 发表于 2020/02/12 14:07:33 2020/02/12
【摘要】 本节书摘来自华章计算机《C编程技巧:117个问题解决方案示例 》 一书中第1章,第1.9节,作者是希里什·查万(Shirish Chavan),卢涛 译。

1.9 隐式类型转换

在赋值语句中,右侧显示的量称为右值(r-value),左侧显示的量称为左值(l-value)。在每个赋值语句中,都要确保左值的数据类型与右值的数据类型相同。有关示例请参阅此处给出的赋值语句(假设intN为int变量):

intN = 350;                     /* L1,现在intN的值是350 */

这里,L1表示LOC 1,为了节省空间,我使用字母L来表示代码中的LOC。在LOC 1中,左值为intN,右值为350,它们的数据类型是相同的:int。当编译器编译这样的语句时,它从不会忘记检查赋值语句两边的类型。编译器的这个任务称为类型检查(typechecking)。如果双方的类型不一样会怎样?会发生类型转换!在类型转换中,右侧的值的类型在赋值之前被更改为左侧的值的类型。类型转换可以分为两类。

隐式或自动类型转换

显式类型转换

注意这里给出的LOC(假设dblN是double变量):

dblN = 35;                      /* L2,好的,现在dblN的值是35.000000 */

在此LOC中,dblN的类型为double,数值常量35的类型为int。这里,编译器将数据类型35从int(源类型)提升为double(目标类型),然后将double类型常量35.000000赋给dblN。这称为隐式类型转换或自动类型转换。在隐式(或自动)类型转换中,类型转换是自动发生的。

在类型转换中,右值的类型称为源类型,左值的类型称为目标类型。如果目标类型的范围宽于源类型的范围,则此类型的转换称为扩大类型转换。如果目标类型的范围窄于源类型的范围,则此类型的转换称为缩小类型转换。LOC 2中的类型转换是扩大类型转换,因为double(目标类型)的范围比int(源类型)的范围宽。

这是隐式类型转换的另一个例子(假设intN是int变量):

intN = 14.85;                   /* L3,好的,现在intN的值是14 */

在此LOC中,数字常量14.85的类型是double,intN的类型是int。这里,编译器将14.85的数据类型从double降级为int,它截断并丢弃其小数部分,然后将整数部分14赋值给intN。LOC 3中的类型转换是缩小类型转换。

这是隐式类型转换的另一个例子:

dblN = 2/4.0;                   /* L4,好的,现在dblN的值是0.500000 */

在此LOC中,右值是一个表达式,该表达式又由数值常量2除以数值常量4.0组成。但是数值常量2的类型是int,而数值常量4.0的类型是double。这里,编译器将数值常量2的类型从int提升为double,然后执行浮点数2.0 / 4.0的除法。结果0.5被赋值给dblN。

■注意 在表达式或赋值语句中混合使用不同类型时,编译器会在计算表达式或赋值时执行自动类型转换。在执行类型转换时,编译器会尽力防止信息丢失。但有时候信息丢失是不可避免的。

例如,在LOC 3中,存在信息丢失(double类型数值常量14.85转换为int类型数值常量14)。在扩大类型转换中没有信息丢失,但在缩小类型转换时存在一些信息丢失。编译器总是允许扩大类型转换。编译器也允许缩小类型转换,但有时编译器会显示警告。不允许无意义的转换。某些类型转换在编译期间允许,但在运行期间会报告错误。例如,请注意这里给出的代码段:

 image.png

编译器成功编译了这段代码,没有任何警告。但是,当你执行这段代码时,屏幕上会显示以下文本行而不是预期的输出:

 image.png

程序在执行LOC M期间“崩溃”,这行代码尝试缩小类型转换。当一个程序在运行时突然终止时,我们用程序员的语言说程序崩溃了。

不同的语言允许将类型混合到不同的程度。允许不受限制地混合不同类型的语言称为弱类型的(weakly typed)语言或具有弱类型的语言。不允许混合不同类型的语言称为强类型的(strongly typed)语言或具有强类型的语言。

■注意 C几乎是一种强类型语言。

C的强类型检查在函数调用中很明显。如果函数需要一个int类型参数,并且将一个字符串作为参数(而不是int类型参数)传递给该函数,那么编译器会报告错误并停止编译程序,这证实了C是一种强类型语言。

请注意,前面使用了几乎这个术语,因为在某种程度上,C语言中允许隐式类型转换,这使得C成为“几乎”强类型的语言,而不是完全强类型的语言。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。