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

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

作者: 特立独行的佩奇 | 来源:发表于2023-02-23 22:34 被阅读0次

    类型转换

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

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

    1. 不同类型的混和运算中,编译器会自动转换数据,转换规则如下:
    • 转换按照数据长度增加的方向进行,以保证数据不失真或者精度不降低
    • 所有浮点运算都是以双精度进行的,即使运算中只有 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语言大部分运算时双目的,少部分单目的,比如取反和逻辑非,只有一个三目运算符,即条件运算符 ? :
    结合性是指相同优先级的条件下,是从右到左进行计算,还是从左到右进行计算
    运算符的结合性表:

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

    规律如下:

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

    void 和 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 );
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/zvetldtx.html