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

本文详细介绍了C语言中的各类运算符,包括算术、关系、逻辑等12类,共计34种运算符。解析了每种运算符的含义、优先级及应用场景,并通过实例演示了如何使用这些运算符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

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(单目运算符)
2sizeof长度运算符自右至左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. 关系运算符

运算符与含义对象个数结合方向优先级
< (小于)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
&& (逻辑或)2 双目运算符左 → 右11
||(逻辑与)2 双目运算符左 → 右12

优先级:! > && > ||

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

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

在这里插入图片描述

4. 赋值运算符

赋值运算符共有11个:

  • 结合性:从右到左,优先级14
  • 双目(元)运算符
  • 赋值运算符: " = "
  • 复合的赋值运算符(扩展赋值运算符): +=-=*=/=%=>>=<<=&=|=^=
1. 赋值运算符: =
变量 = 常数;
a = 3; //将3的值赋给变量a
2. 复合的赋值运算符
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);
}

在这里插入图片描述

在这里插入图片描述

使用条件运算符需要注意的有一点:
例题:
设 x = 2,y = 3,z = 4,k = 5,则表达式“x < y ? x++ : z < k ? x : k”的值是( )
A. 1 B.2 C.3 D.4
分析:首先条件运算符的结合方向是:右 → 左,即可以写成 (x < y ? x++ : z < k) ? x : k 这种形式;先计算 x < y ? x++ : z 结果为真,然后再计算 x++ ? x : k;虽然结合方向是从右到左,但运算时是从左到右计算的。
但是这题需要注意的是 x++ ? x : k 的结果是 x = 2,原因是x现参与条件运算,然后++
结果:B

6. 逗号运算符

结合方向:左 → 右
优先级:15(最低)
在这里插入图片描述

7. 强制类型转换运算符

强制类型转换运算符:(类型)

右 → 左,优先级2,单目运算符

在这里插入图片描述

8. 下标运算符

下标运算符:[ ]

  • 用处:数组
  • 结合方向:左 → 右
  • 优先级:1
1. 数组名 [下标]
下标:可以是正常量 或 整型表达式
int a[10]   //定义一个数组长度为10的数组
a[0] = 66;  //对下标为0的元素赋值
void sort(int array[],int n)  
//选择排序中,定义sort函数,实参传递方式:地址传递

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;
}

在这里插入图片描述

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;
}

在这里插入图片描述

如果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;
}

运行结果……………………………………………………

在这里插入图片描述

12. 位运算符 和 其它

① 位运算符: << >> ~ | ^ &

  • 位运算是指以二进制位为对象的运算,指针运算和位运算往往是编写系统软件会常常用到。
  • 参与位运算的对象只能是整型或字符型数据,不能是实型数据。
  • 位运算除了~,其余都是二目(元)运算符

在这里插入图片描述

② 函数调用运算符:()

  • 函数调用运算符处于有:指向函数的指针、返回指针的函数
  • 优先级1
int (*p)(int ,int ); //指向函数的指针:定义指向函数的指针变量p
int *a(int x,int y); //返回指针的函数

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

相见就是【猿分】
在这里插入图片描述

希望上面的内容对你能有有所帮助
以上内容如有错误,请大家在评论区指正,谢谢支持,共同进步。 加油!!!
如果你感觉我写的内容对你有一定的帮助,请给我点一个 【赞】作为您对我的鼓励, 谢谢!!

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空之路Star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值