C 语言学习(6) ---- 类型转换和运算符结合性

2023-02-23  本文已影响0人  特立独行的佩奇

类型转换

自动类型转换
  1. 将一种类型的数据变量赋值给另一种类型的变量
    float f = 100;
    int n = f;

赋值运算符两边数据类型不同时,自动将右值的类型转换为左值的类型,可能会造成数据失真,或者精度降低

  1. 不同类型的混和运算中,编译器会自动转换数据,转换规则如下:
强制类型转换
#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语言大部分运算时双目的,少部分单目的,比如取反和逻辑非,只有一个三目运算符,即条件运算符 ? :
结合性是指相同优先级的条件下,是从右到左进行计算,还是从左到右进行计算
运算符的结合性表:

优先级和结合性.jpg 优先级和结合性02.jpg 优先级和结合性03.jpg

规律如下:

  1. 逗号运算符优先级最低,数组下标运算符优先级最高;
  2. 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符 逻辑运算符中的逻辑非优先级比较高
  3. 所有双目运算符只有赋值运算符的结合方向是从右到左
一些容易出错的优先级问题
常见优先级问题.jpg

void 和 void* 类型

void 类型

void 类型不能用于定义变量,只用于函数返回值的限定和函数参数的限定

void* 类型
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
上一篇下一篇

猜你喜欢

热点阅读