第四章 运算符与表达式
C语言中要进行数据运算就必须用到运算符,运算符有不同的优先级和结合性,C语言一共提供了15档优先级的运算符。
上表可以总结出如下的规律:
- 结合方向只有三个是从右往左,其余都是从左往右。
- 所有双目运算符中只有赋值运算符的结合方向是从右往左。
- 另外两个从右往左结合的运算符也很好记,一个是单目运算符,一个是三目运算符
- C语言中有且只有一个三目运算符
- 逗号运算符的优先级最低
- 对于优先级:算术运算符>关系运算符>逻辑运算符>赋值运算符。逻辑运算符中逻辑非“!”除外。
由运算符和运算对象组成的式子,被称为表达式。
1.算术运算符和算术表达式
算术运算符用于执行程序中的数学运算,下面以取余%运算符为例:
1 #include<stdio.h> 2 int main() 3 { 4 int a = 10; 5 int b = 20; 6 printf("%d\n",b%a); 7 printf("%d\n",a%3); 8 printf("%d\n",b%3); 9 printf("%d\n",20%4); 10 return 0; 11 }
运行结果为:
0
1
2
0
注意:除法运算符中,两个整数相除结果为整数,两个浮点数相除,结果为浮点数,如果两个操作数中有一个是浮点数,相除结果也是浮点数。
取余运算符要求两个操作数都必须是整数。
2.赋值运算符和赋值表达式
赋值运算
1 #include<stdio.h> 2 int main() 3 { 4 int a; 5 int b; 6 int c; 7 a = 20; //将20赋值给变量a 8 b = a-10;//将a-10的结果赋值给变量b 9 c = a+b;//将a+b的结果赋值给变量c 10 printf("a=%d\n",a); 11 printf("b=%d\n",b); 12 printf("c=%d\n",c); 13 return 0; 14 }
复合赋值运算
1 #include<stdio.h> 2 int main() 3 { 4 int a = 10; 5 int b = 20; 6 a+=b*2; //等价于a=a+(b*2) 7 b%=a+5; //等价于b=b%(a+5) 8 printf("a=%d\n",a); 9 printf("b=%d\n",b); 10 return 0; 11 }
赋值运算符比较简单,直接看代码就可以明白。
3.自增、自减运算符
自增运算符“++”
自减运算符“--”
自增、自减运算符位置不同表达的意思也不同,分为两种情况:
++x; //x先自增1,然后参加运算
x++; //x先参加运算,然后自增1
注意:自增、自减运算符只能操作一个操作数,并且只能是数值类型(整型、浮点型)的变量,不能是常量或者表达式。
1 #include<stdio.h> 2 int main() 3 { 4 int a = 1; 5 int b =0; 6 b = a++; //先把a的值赋给b,然后a再自增 7 printf("a=%d\n",a); 8 printf("b=%d\n",b); 9 return 0; 10 }
运行结果:
a=2
b=1
1 #include<stdio.h> 2 int main() 3 { 4 int a = 1; 5 int b =0; 6 b = ++a; //a先自增,然后把值赋给b 7 printf("a=%d\n",a); 8 printf("b=%d\n",b); 9 return 0; 10 }
运行结果:
a=2
b=2
4.关系运算符与关系表达式
关系运算符又称为“比较运算符”,用于执行程序中的比较运算。常用的关系运算符有以下6种:
- <小于
- <=小于等于
- >大于
- >=大于等于
- ==等于
- !=不等于
使用关系运算符比较的时候,当结果为真,则返回1,否则返回0。
1 #include<stdio.h> 2 int main() 3 { 4 int a=10; 5 int b=20; 6 int c=30; 7 printf("%d\n", 1>2); 8 printf("%d\n", 5>=2); 9 printf("%d\n", a<2); 10 printf("%d\n", a<=b); 11 printf("%d\n", a+b==c); 12 printf("%d\n", c!=a+b); 13 return 0; 14 }
5.逻辑运算符与逻辑表达式
C语言中,采用0代表逻辑假,非0代表逻辑真。
C语言提供的逻辑运算符一共有三种:
- &&逻辑与
- ||逻辑或
- !逻辑非
其中逻辑与&&和逻辑或||都是双目运算符,需要两个操作数才能运算。逻辑非!是单目运算符,只需要一个操作数。
在C语言中,使用逻辑运算符时,常常会遇到一些陷阱。其中包括短路与、短路或。
5.1短路与
当逻辑与&&左侧为假时,逻辑与表达式结果直接为假,&&右侧不再进行判断。
1 #include<stdio.h> 2 int main() 3 { 4 int a = 8; 5 int b = (a>5)&&((a=a+5)<10);//a>5判断为真后,还要判断&&右边的((a=a+5)<10),这时a的值就变成了13。 6 printf("b=%d\n",b); 7 printf("a=%d\n",a); 8 return 0; 9 }
运行结果:
b=0
a=13
1 #include<stdio.h> 2 int main() 3 { 4 int a = 8; 5 int b = (a<5)&&((a=a+5)<10);//当判断a<5为假后,就直接跳过了右边的计算,整个逻辑与&&都判定为假。 6 printf("b=%d\n",b); 7 printf("a=%d\n",a); 8 return 0; 9 }
运行结果:
b=0
a=8
5.2短路或
当||左侧为真时,逻辑或运算符表达式结果直接为真,||右侧将不再进行判断。
1 #include<stdio.h> 2 int main() 3 { 4 int a = 8; 5 int b = (a<5)||((a=a+5)<10);//左侧的a<5判断为假,则继续判断逻辑或||的右边((a=a+5)<10),这时a的值就变为了13 6 printf("b=%d\n",b); 7 printf("a=%d\n",a); 8 return 0; 9 }
运行结果:
b=0
a=13
1 #include<stdio.h> 2 int main() 3 { 4 int a = 8; 5 int b = (a>5)||((a=a+5)<10);//左侧的a>5判断为真,则直接跳过逻辑或||右边的计算,整个逻辑或||判定为真 6 printf("b=%d\n",b); 7 printf("a=%d\n",a); 8 return 0; 9 }
运行结果:
b=1
a=8
6.条件运算符与条件表达式
条件运算符用于处理程序中简单的条件运算,作用时当满足一定条件时,执行某段特定的代码,否则执行其他的代码。
条件运算符是唯一的三目运算符,由?与:两个符号组成,不可分割。
条件表达式的一般使用形式为
表达式1?表达式2:表达式3
运算规则是,如果表达式1的结果为真,以表达式2的值作为整个表达式的值,否则以表达式3的值作为整个表达式的值。例如:max=a>b?a:b
1 #include<stdio.h> 2 int main() 3 { 4 int a=9; 5 int b=0; 6 b=(a>10?888:666); 7 printf("b=%d\n",b); 8 b=(a>5?888:666); 9 printf("b=%d\n",b); 10 return 0; 11 }
运行结果:
b=666
b=888
7.求字节数运算符
求字节数运算符sizeof用于计算变量、常量、类型所占字节数。
第一种用法:sizeof(类型)
上述表达式的运算结果为括号中的类型在当前操作系统下所占字节数
示例如下:
1 #include<stdio.h> 2 int main() 3 { 4 printf("sizeof(char)=%d\n",sizeof(char)); 5 printf("sizeof(int)=%d\n",sizeof(int)); 6 printf("sizeof(float)=%d\n",sizeof(float)); 7 printf("sizeof(double)=%d\n",sizeof(double)); 8 return 0; 9 }
第二种用法:sizeof(变量)
上述表达式的运算结果为括号中的类型在当前操作系统下所占字节数
示例如下:
1 #include<stdio.h> 2 int main() 3 { 4 char ch='A'; 5 int a=100; 6 float f=3.14; 7 double d=3.14; 8 printf("sizeof(ch)=%d\n",sizeof(ch)); 9 printf("sizeof(a)=%d\n",sizeof(a)); 10 printf("sizeof(f)=%d\n",sizeof(f)); 11 printf("sizeof(d)=%d\n",sizeof(d)); 12 return 0; 13 }
8.强制类型转换运算符
强制类型转换运算符由括号()和数据类型两部分构成。其一般使用形式为:
(数据类型)常量;
(数据类型)变量;
(数据类型)(表达式);
其作用是将常量、变量、表达式运算结果等,转化为括号中的指定数据类型。
示例如下:
1 #include<stdio.h> 2 int main() 3 { 4 int a; 5 float f; 6 a = (int)3.14;//强制类型转换,将3.14转化为整型,直接变为3 7 f = (float)(10+20);//强制类型转换,将表达式(10+20)的结果整型转化为浮点型 8 printf("a=%d\n",a); 9 printf("f=%f\n",f); 10 return 0; 11 }
注意:
- 如果强制转换的对象是表达式,需要用括号将表达式括起来。
- 强制类型转换过程中,系统会产生一个和指定类型相同的临时结果,原变量的类型没有改变。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!