C 语言学习(6) ---- 类型转换和运算符结合性
类型转换
自动类型转换
- 将一种类型的数据变量赋值给另一种类型的变量
float f = 100;
int n = f;
赋值运算符两边数据类型不同时,自动将右值的类型转换为左值的类型,可能会造成数据失真,或者精度降低
- 不同类型的混和运算中,编译器会自动转换数据,转换规则如下:
- 转换按照数据长度增加的方向进行,以保证数据不失真或者精度不降低
- 所有浮点运算都是以双精度进行的,即使运算中只有 float 类型,也会先转换为double 类型,再进行运算
-
char 和 short 参与运算,必须先转换为 int 类型
自动类型转换.jpg
强制类型转换
#include <stdio.h>
int main() {
int sum = 103;
int count = 7;
doubel average;
average = (double)sum / count;
printf("average: %f", average);
}
sum 和 count 都是 int 类型,如果不进行干预,运算结果也会是int 类型,虽然 average 是double 类型,但是小数部分被提前剔除,结果会是 12.0000;
通过强制将 sum 转换为 double 类型,对于除法运算,其中一个是double 类型,计算结果也会按照double 类型进行保留;
注意()的优先级高于 /,对于表达式(double) sum / count,会先执行(double) sum,将 sum 转换为 double 类型,然后再进行除法运算,这样运算结果也是 double 类型,能够保留小数部分
变量转换知识临时性的,不会改变数据原来的类型和值,上面的 sum 任然是int 类型,不会改变
运算符优先级和结合性
所谓优先级就是:不同的运算符混合运算时计算次序问题,同时运算符还有目的概念,目表示运算符有几个操作数,比如+运算符有两个运算符,它就是双目的,C语言大部分运算时双目的,少部分单目的,比如取反和逻辑非,只有一个三目运算符,即条件运算符 ? :
结合性是指相同优先级的条件下,是从右到左进行计算,还是从左到右进行计算
运算符的结合性表:
规律如下:
- 逗号运算符优先级最低,数组下标运算符优先级最高;
- 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符 逻辑运算符中的逻辑非优先级比较高
- 所有双目运算符只有赋值运算符的结合方向是从右到左
一些容易出错的优先级问题
常见优先级问题.jpgvoid 和 void* 类型
void 类型
void 类型不能用于定义变量,只用于函数返回值的限定和函数参数的限定
void* 类型
-
void 指针可以指向任意类型的数据,也就是任意类型的指针都可以对 void 指针赋值,不需要强制类型转换
比如memcpy 的参数就是 void* 类型的 -
将void* 类型的指针赋值给其他类型的指针,需要强制类型转换
内存分配函数 malloc 的返回值就是 void* 类型,表示用于可以显示说明执行的内存中存放的是什么类型的数据
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );