虽然C语言的隐式转换使用起来非常方便,但我们有些时候还需要从更大程度上控制类型转换。基于这种原因,C语言提供了强制类型转换。强制类型转换表达式的格式如下: 【强制转换表达式】(类型名)表达式 这里的类型名表示的是表达式应该转换成类型。 下面的例子显示了使用强制类型转换表达式计算float类型值小数部分的方法: float f, frac_part: frac_part = f - (int) f; 强制类型转换表达式(int)f 表示把 f 的值转换成int类型的结果。C语言的常用算术转换则要求在进行减法运算前把(int)f 转换回 float 类型。 f 和(int) f 的不同之处就在于 f 的小数部分, 这部分在强制类型转换时被丢掉了。 强制类型转换表达式可以用于显示那些肯定会发生的类型转换: i = (int) f ; 它也可以用来控制编译器并且强制它进行我们需要的转换。思考下面的例子: flaot quotient; int dividend, divisor; quotient = dividend / divisor; 正如现在写的那样,除法的结果是一个整数,在把结果存储在quotient 的变量中之前,要把结果存储在quotient变量中之前,要把结果转换成float格式。但是,为了得到更精确的结果,可能需要再除法执行之前把dividend和divisor的类型转换成float格式的。强制类型转换表达式可以完成这一点: quotient = (float) dividend / divisor; 变量divisor不需要进行强制类型转换,因为把变量dividend强制转换成flaot类型会迫使编译器把divisor也转换成float类型。 顺便提一下,C语言把(类型名)视为一元运算符。 一元运算符的优先级高级二元运算符,所以编译器会把表达式 (float) dividend / divisor 解释为 ((float) dividend) / divisor 如果感觉有点混淆,那么注意还有其他方法可以实现同样的效果: quotient = dividend / (float) divisor; 或者 quotient = (float) dividend / (float) divisor; 有些时候,需要使用强制类型转换来避免溢出。思考下面例子; long i; int j = 1000; i = j * j; /*overfloaw may occur*/ 乍看之下,这条语句没有问题。表达式j * j 的值是1000000, 并且变量 i 是long int类型的,所以 i 应该能很容易地存储这种大小的值,不是吗?问题是,当两个int类型值相乘时,结果也应该是int 类型的,但是j * j 的结果太大,以致在某些机器上无法表示成int 型,从而导致溢出。幸运的是,可以使用强制类型转换避免这种问题的发生: i = (long)j * j; 因为强制运算符的优先级高于*,所以第一个变量j 会被转换成long int 类型,同时也迫使第二个j 进行转换。注意,语句 i=(long)(j*j); 是不对的,因为溢出在强制类型转换之前就已经发生了。 |
|
相关文章
- 11-19labview强制转换的一个坑
- 11-19pytorch中tensor类型转换的几个函数
- 11-19C++ Pirmer : 第十五章 : 面向对象程序设计之基类和派生的定义、类型转换与继承与虚函数
- 11-19", line 1, in
NameError: name 'nan' is not defined">Python使用eval强制转换字符串为字典时报错:File " ", line 1, in NameError: name 'nan' is not defined - 11-19lambda表达式将List对象某个字段转换以逗号分隔的String类型
- 11-19强制转换
- 11-19C++新式类型转换
- 11-19CodeGo.net> AutoMapper-使用自定义类型转换器将数据表映射到类对象
- 11-19字符串string类型转换成DateTime或DateTime?类型
- 11-19002数据类型与进制转换