目录
一、前言
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. 关系运算符
运算符与含义 | 对象个数 | 结合方向 | 优先级 |
---|---|---|---|
< (小于) | 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);
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); //返回指针的函数
对于上面两种运算符,我只是看了一遍,并没有深入学习,所以这里就不作详细介绍了。
最后推荐文章:
- C语言重要知识点总结【4】:C语言的32个关键字和9种控制语句
- C语言重要知识点总结【6】:C语言9种控制语句(详解)
- C语言重要知识点总结【7】:C语言中的常量、变量、标识符
- C语言重要知识点总结【8】:C语言中变量的数据类型
相见就是【猿分】
希望上面的内容对你能有有所帮助
以上内容如有错误,请大家在评论区指正,谢谢支持,共同进步。 加油!!!
如果你感觉我写的内容对你有一定的帮助,请给我点一个 【赞】作为您对我的鼓励, 谢谢!!