C语言重要知识点总结【9】:C语言运算符(详解)

C语言重要知识点总结【9】:C语言运算符(详解)

目录

  • 一、前言- 二、运算符分类- 三、运算符的优先级- 四、常用运算符-

    一、前言

    C语言主要特点之一:运算符丰富

    C语言的运算符包含的范围广泛,共有34种运算符。C语言把括号、逗号、叹号、赋值和强制转换等都作为运算符处理,从而使C语言的运算类型及其丰富,表达式类型多样化。灵活使用运算符可以实现在其他高级语言中难以实现的运算。

    基础的C语言运算符是每个程序员都应该学会的,我们非常有必要清晰地知道运算符一共有哪些哪些是需要我们必须掌握的。

    这篇文章对C语言常见运算符进行详细讲解,由于在学校写博客的时间少和不方便,所以部分内容我会用我以前用office制作的PPT截图进行分析。
    如果文章中有啥错误和分析不到位的地方,希望大家指点 ,谢谢支持,共同进步!!!

    二、运算符分类

    共12类 运算符种类 运算符
    1 算术运算符 + - * / % ++ --
    2 关系运算符 > < == >= <= !=
    3 逻辑运算符 ! && ` `
    4 位运算符 << >> ~ ` `^ &
    5 赋值运算符 =(及其扩展赋值运算符)
    6 条件运算符 ? :
    7 逗号运算符 ,
    8 指针运算符 *&
    9 求字节运算符 sizeof
    10 强制类型转换运算符 类型
    11 成员运算符 .->
    12 下标运算符 [ ]
    13 其它 如函数调用运算符()

    【注意】可从一下几个角度大致可将C语言的运算符分为:13类运算符 或 34种运算符,总共有44个运算符。

    细心的你会发现上面运算符不够44个,对于第5类运算符:赋值运算符一共有11个。在下面运算符优先级和结合方向表格中会详细介绍。

    三、运算符的优先级

    运算符的优先级一共可分为15级:

    1级优先级最高15级优先级最低

    同一优先级的运算符(当一个运算对象两侧运算符的优先级别相同时),运算次序由结合方向(结合性)所决定, 除了单目运算符三目运算符赋值运算符这三种是从右往左外,其他的运算符都是从左往右

    常用运算符常见记法:

    > 算术运算符 > 关系运算符 > && > || > 赋值运算符

    优先级 运算符含义 结合方向 对象个数
    1 ( )圆括号 自左至右
    1 [ ]下标运算符 自左至右
    1 ->指向结构体成员运算符 自左至右
    1 .结构体成员运算符 自左至右
    2 !逻辑非运算符 自右至左 1(单目运算符)
    2 ~按位取反运算符 自右至左 1(单目运算符)
    2 ++自增运算符 自右至左 1(单目运算符)
    2 - -自减运算符 自右至左 1(单目运算符)
    2 -负号运算符 自右至左 1(单目运算符)
    2 (类型)类型转换运算符 自右至左 1(单目运算符)
    2 *指针运算符 自右至左 1(单目运算符)
    2 &取地址运算符 自右至左 1(单目运算符)
    2 sizeof长度运算符 自右至左 1(单目运算符)
    3 *乘法运算符 自左至右 2(双目运算符)
    3 /除法运算符 自左至右 2(双目运算符)
    3 %求余运算符 自左至右 2(双目运算符)
    4 +加法运算符 自左至右 2(双目运算符)
    4 -减法运算符 自左至右 2(双目运算符)
    5 <<左移运算符 自左至右 2(双目运算符)
    5 >>右移运算符 自左至右 2(双目运算符)
    6 >大于运算符 自左至右 2(双目运算符)
    6 >=大于等于运算符 自左至右 2(双目运算符)
    6 <小于运算符 自左至右 2(双目运算符)
    6 <=小于等于运算符 自左至右 2(双目运算符)
    7 ==等于运算符 自左至右 2(双目运算符)
    7 !=不等于运算符 自左至右 2(双目运算符)
    8 &按位异或运算符 自左至右 2(双目运算符)
    9 ^按位与运算符 自左至右 2(双目运算符)
    10 ` `按位或运算符 自左至右 2(双目运算符)
    11 &&逻辑与运算符 自左至右 2(双目运算符)
    12 ` `逻辑或运算符 自左至右 2(双目运算符)
    13 ? :条件运算符 自右至左 3三目运算符
    14 =赋值运算符 自右至左 2(双目运算符)
    14 +=加后赋值 自右至左 2(双目运算符)
    14 -=减后赋值 自右至左 2(双目运算符)
    14 *=乘后赋值 自右至左 2(双目运算符)
    14 /=除后赋值 自右至左 2(双目运算符)
    14 %=去取后赋值 自右至左 2(双目运算符)
    14 >>=左移后赋值 自右至左 2(双目运算符)
    14 <<=右移后赋值 自右至左 2(双目运算符)
    14 &=按位与后赋值 自右至左 2(双目运算符)
    14 ^=按位异或后赋值 自右至左 2(双目运算符)
    14 ` =`按位或后赋值 自右至左 2(双目运算符)
    15 ,逗号运算符 自左至右

    四、常用运算符

    通过上面介绍的内容,接下来开始介绍常见运算符的使用。

    1. 算术运算符

    运算符与含义 对象个数 结合方向 优先级
    ++(自增) 1 单目运算符 2
    - - (自减) 1 单目运算符 2

    在这里插入图片描述

    在这里插入图片描述

    运算符与含义 对象个数 结合方向 优先级
    < (小于) 2 双目运算符 左 → 右 6
    <= (小于等于) 2 双目运算符 左 → 右 6
    > (大于) 2 双目运算符 左 → 右 6
    >= (大于等于) 2 双目运算符 左 → 右 6
    == (等于) 2 双目运算符 左 → 右 7
    != (不等于) 2 双目运算符 左 → 右 7

    关系运算符常用在条件判断,循环结构等中:

    for(i=0; i<10; i++)
    if(a < b+c)
    if(a != 0) //等同 if(a)

    在这里插入图片描述

    #include <stdio.h>
    int main()
    {<!-- -->
        int a=3,b=5,c=1;
        printf("b>a = 5>3      结果:%d\n",b>a);
        printf("b>a>c = 5>3>1  结果:%d\n",b>a>c);
        printf("b>=a = 5>=3    结果:%d\n",b>=a);
        printf("b!=a = 5!=3    结果:%d\n",b!=a);
    
     return 0;
    }

    在这里插入图片描述

    3. 逻辑运算符

    运算符与含义 对象个数 结合方向 优先级
    ! (逻辑非) 1 单目运算符 2
    &amp;&amp; (逻辑或) 2 双目运算符 左 → 右 11
    ` `(逻辑与) 2 双目运算符 左 → 右 12

    优先级:! > &amp;&amp; > ||

    if((year%4==0 && year%100!=0) || (year%400==0))
         printf("%d是闰年\n",year);

    判断闰年的3种方法(判断+范围输出)

    在这里插入图片描述

    4. 赋值运算符

    赋值运算符共有11个:

    • 结合性:从右到左,优先级14- 双目(元)运算符- 赋值运算符: " = "- 复合的赋值运算符(扩展赋值运算符): +=-=*=/=%=&gt;&gt;=&lt;&lt;=&amp;=|=^= ```
    1. 赋值运算符: = 变量 = 常数; a = 3; //将3的值赋给变量a
    
    
    1. 复合的赋值运算符 a += b; //等价 a = a+b; x = y+8; //等价 x = x(y+8); x %= 6 //等价 x = x%6;

    x %= y+2 //等同 x %= (y+2) 等价 x = x%(y+2); //注意:不要错写成 x=x%y+2;

    
    ## 5. 条件运算符
    
    条件运算符:`? :`
    - 结合方向:右 → 左,优先级13- 唯一的三目运算符

    max = (a>b) ? a: b

    
    

    include<stdio.h>

    int main() { int a=66, b=88; int max; max = (a>b) ? a: b; printf("max = %d",max); }

    
    <img src="https://img-blog.csdnimg.cn/20201012172307661.png#pic_center" alt="在这里插入图片描述">
    
    <img src="https://img-blog.csdnimg.cn/20201011204543700.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjAyMjA4Mw==,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述">
    
    ## 6. 逗号运算符
    
    结合方向:左 → 右 <img src="https://img-blog.csdnimg.cn/20201011214253128.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjAyMjA4Mw==,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述">
    
    ## 7. 强制类型转换运算符
    
    强制类型转换运算符:`(类型)`
    
    右 → 左,优先级2,单目运算符
    
    <img src="https://img-blog.csdnimg.cn/20201011214437520.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjAyMjA4Mw==,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述">
    
    ## 8. 下标运算符
    
    下标运算符:`[ ]`
    - 用处:数组- 结合方向:左 → 右- 优先级:1
    1. 数组名 [下标] 下标:可以是正常量 或 整型表达式 int a[10] //定义一个数组长度为10的数组 a[0] = 66; //对下标为0的元素赋值 void sort(int array[],int n)
      //选择排序中,定义sort函数,实参传递方式:地址传递
    - [冒泡排序与选择排序(方法+动画+算法十大排序分类图)](https://blog.csdn.net/weixin_46022083/article/details/106197302)- [斐波那契数列(Fibonacci)(黄金分割)](https://blog.csdn.net/weixin_46022083/article/details/105796892)
    ## 9. 指针运算符
    
    指针运算符:`&` 和 `*`
    
    结合方向:`右` → `左`
    
    |运算符与含义|对象个数|优先级
    |------
    |&(取地址运算符)|1 单目运算符|2
    |*(指针运算符)|1 单目运算符|2

    【1】取地址运算符:& &a 是变量a的地址 【2】指针运算符(或称“间接运算符”): p代表指针变量p指向的对象

    include <stdio.h>

    int main() {

    int a = 666, *p;
    p = &a;   //使指针变量p 指向 变量a
    
    printf("%d\n",&a);   //输出变量a的 地址 
    printf("%d\n",p);   //输出指针变量p指向的 变量a的地址 
    printf("%d\n",*p);   //输出指针变量p指向的 变量a的值 
    
    return 0;
    

    }

    
    <img src="https://img-blog.csdnimg.cn/20201012143016513.png#pic_center" alt="在这里插入图片描述">
    
    ## 10. 成员运算符
    
    成员运算符:`->` 和 `.`
    
    |运算符与含义|结合方向|优先级
    |------
    |`.`(结构体成员运算符)|左 → 右|1
    |`->`(指向结构体成员运算符)|左 → 右|1
    
    用处:结构体数组(`.`和结构体指针(`->`)

    成员运算符:-> 和 .

    include<stdio.h>

    include<string.h>

    int main() { struct Student //声明结构体类型 struct Student { int num; char name[20]; char sex; float score; }; struct Student stu; //定义struct Student类型变量 stu struct Student *p; //定义指向struct Student类型数据的指针变量 p p = &stu; //p指向 stu

    //对结构体成员赋值 stu.num = 10101; strcpy(stu.name,"Li Lin"); //用字符串复制函数给 stu.name赋值 stu.sex = 'M'; stu.score = 88.8;

    //通过 结构体变量名stu 访问它的成员 printf("No.:%d\tname:%s\tsex:%c\tscore:%5.1f\n\n",stu.num, stu.name, stu.sex, stu.score);

    //通过 指向结构体变量的指针变量 访问它的成员 printf("No.:%d\tname:%s\tsex:%c\tscore:%5.1f\n\n",(p).num, (p).name, (p).sex, (p).score); printf("No.:%d\tname:%s\tsex:%c\tscore:%5.1f\n\n",p->num, p->name, p->sex, p->score);

    return 0; }

    
    <img src="https://img-blog.csdnimg.cn/20201012144634383.png#pic_center" alt="在这里插入图片描述">

    如果p指向一个结构体变量stu 下面3种用法等价:

    1. stu.成员名 stu.num
    2. (p).成员名 (p).num
    3. p->成员名 p->num
    
    ## 11. 求字节运算符

    include <stdio.h>

    // 【sizeof】 关键字:统计数据类型所占内存大小 // 语法: sizeof(数据类型) // 或 sizeof(变量) // 整型占内存大小比较:short < int <= long <= long long

    int main() { short a = 10; printf("short 占用内存空间:%d\n", sizeof(short) ); printf("short 占用内存空间:%d\n", sizeof(a) );

    int b = 10;
    printf("int    占用内存空间:%d\n", sizeof(int) ); 
    
    long c = 10;
    printf("long   占用内存空间:%d\n", sizeof(long) ); 
    
    long long d = 10;
    printf("long long  占用内存空间:%d\n", sizeof(long long) );
    
    return 0;
    

    }

    
    运行结果……………………………………………………
    
    <img src="https://img-blog.csdnimg.cn/20201011220911524.png#pic_center" alt="在这里插入图片描述">
    
    ## 12. 位运算符 和 其它
    
    ① 位运算符: `<<` `>>` `~` `|` `^` `&`
    - 位运算是指以二进制位为对象的运算,指针运算和位运算往往是编写系统软件会常常用到。- 参与位运算的对象只能是整型或字符型数据,不能是实型数据。- 位运算除了`~`,其余都是二目(元)运算符
    <img src="https://img-blog.csdnimg.cn/20201012152015220.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjAyMjA4Mw==,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述">
    
    ② 函数调用运算符:`()`
    - 函数调用运算符处于有:指向函数的指针、返回指针的函数- 优先级1

    int (p)(int ,int ); //指向函数的指针:定义指向函数的指针变量p int a(int x,int y); //返回指针的函数

    ```

    对于上面两种运算符,我只是看了一遍,并没有深入学习,所以这里就不作详细介绍了。 最后推荐文章:

    希望上面的内容对你能有有所帮助 如果你感觉我写的内容对你有一定的帮助,请给我点一个 【赞】作为您对我的鼓励, 谢谢!!

posted @ 2020-12-29 11:29  刘桓湚  阅读(840)  评论(0编辑  收藏  举报