C运算符
运算符
1.运算符介绍
- 运算符是一种特殊的符号,用以表示数据的 运算、 赋值和 比较等
- 算术运算符 (+, -, * , / , %)
- 赋值运算符 (= += -= ..)
- 关系运算符(比较运算符)(比如 > >= < <= == 等等)
- 逻辑运算符 (&& 逻辑与 || 逻辑或 ! 逻辑非)
- 位运算符 (& 按位与 | 按位或 ^ 按位异或 ~ 按位取反等等)
- 三元运算符 ( 表达式 ? 表达1 : 表达2)
2.算数运算符
2.1 算术运算符
- 算术运算符是对数值类型的变量进行运算的,在C程序中使用非常多
2.2 算术运算符一览
2.3 案例演示
-
案例演示算数运算符的使用
- +,-,*,/,%,++,--,重点说明/,%,++
-
自增++
- 作为独立的语句使用
- 前++和后++都完全等价于 i=i+1
- 作为表达式使用
- 前++:先自增后赋值
- 后++:先赋值后自增
-
--,+,-,*一样的道理
-
代码演示
#include <stdio.h>
void main(){
double d1 = 10 / 4;
double d2 = 10.0 / 4;//如果希望保留小数,参与运算数必须有浮点数
//取模公式
//a%b=a - a/b*b
int res1 = 10 % 3;
int res2 = -10 % 3;
int res3 = 10 % -3;
int res4 = -10 % -3;
//++的使用
int i = 10;
int j = i ++;//等价规则是:j = i;i=i+1;
int k = ++i; //等价规则是:i=i+1;k=i;
printf("i=%d j=%d",i,j);
printf("i=%d k=%d",i,k);
printf("d1=%f d2=%f res1=%d res2=%d res3=%d res4=%d",d1,d2,res1,res2,res3,res4);
//++或者--还可以独立使用,就相当于自增自减
//k++等价于k=k+1
//++k等价于k=k+1
//如果独立使用 ++k和k++完全等价
k++;
++k;
printf("k=%d",k);
getchar();
}
2.4 细节说明
- 对于除号/,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分
- 当对一个数取模时,可以等价a%b=a-a/b*b ,可以看到取模的本质运算
- 当自增作为一个独立的语句时,++i 和i++等价
- 当自增作为一个表达式使用时j=++i等价i=i+1,j=i
- 当自增作为一个表达式使用时j=i++等价j=i,i=i+1
2.5 练习
void main(){
int i1 = 10,i2 = 20;
int i = i1++;
printf("i=%d ",i);
printf("i1=%d",i1);
i=++i1;
printf("i=%d",i);
printf("i1=%d",i1);
i=i2--;
printf("i=%d",i);
printf("i2=%d",i2);
i=--i2;
printf("i=%d",i);
printf("i2=%d",i2);
getchar();
}
#include <stdio.h>
void main(){
//假如还有97天放假,问:几个星期零几天
//思路
//1.定义一个days保存天数
//2.定义week保存计算得到星期
//3.定义leftDays保存剩余的天数
//使用 % 和/
int days = 97;
int week = days / 7;
int leftDays = days % 7;
//定义一个变量保存华氏温度,华氏温度转换摄氏温度公式为:5/9(华氏温度-100,求华氏温度对应的摄氏温度)
//用huashi表示华氏温度
//用sheshi表示摄氏温度
//使用公式来进行转换
double huashi =146.3;
double sheshi = 5.0/9(huashi-100);
printf("华氏温度 %。2f对应的摄氏温度是%。2f",huashi,sheshi);
printf("有%d个星期零%d天放假",week,leftDays);
getchar();
}
3.关系运算符(比较运算符)
3.1介绍
- 关系运算符的结果要么是真(非零表示),要么是假(零表示)
- 关系表达式经常用在if结构的条件中或循环结构的条件中
3.2 关系运算符一览
== 等于
!= 不等于
< 小于
<= 小于等于
3.3 案例演示
#include <stdio.h>
void main(){
int a = 8;
int b = 7;
printf("a>b=%d",a>b);
printf("a>=b=%d",a>=b);
printf("a<b=%d",a<b);
printf("a<=b=%d",a<=b);
printf("a==b=%d",a==b);
printf("a!=b=%d",a!=b);
getchar();
}
3.4 细节说明
- 关系运算符的结果要么是真(非零表示,默认使用1),要么是假(0表示)
- 关系运算符组成的表达式,我们称之为关系表达式
- 比较运算符==不能误写成=赋值;
4.逻辑运算符
4.1 介绍
- 假设变量A的值为1,变量B的值为0,则
&& 逻辑与运算符,如果两个操作数都非零,则条件为真,否则结果为零
|| 逻辑或运算符,如果两个操作数中有任意一个非零,则条件为真
! 逻辑非运算符,用来逆转操作数的逻辑状态,如果条件为真则逻辑非运算符将其为假
4.2 案例 演示
#include <stdio.h>
void main(){
double score = 70;
if(score >=60 && score <= 80){
printf("ok1");
}else{
printf("ok2");
}
int a = 10,b = 99;
//1.在进行逻辑与&&运算时,如果第一个条件为false,则后面的条件不在判断
//2.该现象称为短路现象,所以逻辑与也称为短路逻辑与
if(a<2&&++b>99){
printf("ok100");
}
printf("b=%d",b);
getchar();
}
#include <stdio.h>
void main(){
int score = 100;
int res = score >99;
if(res){
printf("hello,tom");
}
if(!res){
printf("hello,jack");
}
getchar();
}
void main(){
int x = 1;
int y = 1;
if(x++==2 && ++y==2){
x=7;
}
printf("x=%d y=%d",x,y);
}
int x=1,y=1;
if(x++==1||++y==1){
x=7;
}
printf("x=%d y=%d",x,y);
getchar();
void main(){
int x = 1;
int y = 0;
short z = 42;
if((z++ ==42)&&(y=1)){
z++;
}
if((x=0)||(++z==45)){
z++;
}
printf("z=%d",z);
getchar();
}
5,赋值运算符
5.1 介绍
- 赋值运算符就是将某个运算后的值,赋给指定的变量
5.2 赋值运算符一览表
- 先将=,+=,-=,*=,/=,%= <<=,>>=,&=,^=,|=和位运算相关。
= 简单的赋值运算符,把右边操作数的值赋给左边操作数
+= 加且赋值运算符,把右边操作数加上左边操作数的结果赋给左边操作数
-= 减且赋值运算符,把左边操作数减去右边操作数的结果赋给左边操作数
*= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数
/= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数
%= 求模且赋值运算符,求两个操作数的模赋值给左边操作数
<<= 左移且赋值运算符
右移且赋值运算符
&= 按位与且赋值运算符
^= 按位异或且赋值运算符
|= 按位或且赋值运算符
5.3 案例演示
- 赋值基本案例[int num = 10+3]
- 有两个变量a和b,要求将其值进行交换,最终打印结果
- +=的使用案例
- 代码演示
#include <stdio.h>
void main(){
//+=的案例,其他的类似-=,*=,/=,%=
int c = 12;
int a2 = 10;
int a = 10;
int b = 20;
//思路是通过一个临时变量来实现a,b值的交换
int temp = a;
a = b;
b = temp;
c += 3;
c += b;
a2 += 1.7
printf("a=%d b=%d c=%d a2=%d",a,b,c,a2);
getchar();
}
5.4 赋值运算符的特点
- 运算顺序从右往左
- 赋值运算符的左边只能是变量,右边可以是变量,表达式,常量值
- 符合赋值运算符等价于下面的效果:a+=3等价于a=a+3;
- 注意在运算时,可能截断小数点后面的部分
int a = 10;
a += 1.7;
a = 11;
6.位运算符
6.1 介绍
- 位运算符作用于位,并逐位执行操作
6.2 位运算符一览表
& 按位与 ,按二进制位进行与运算
| 按位或运算符,按二进制进行或运算
- ^ 异或运算符,按二进制位进行异或
- 取反运算符,按二进制位进行取反运算
<< 二进制左移运算符,将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)
二进制右移运算符,将一个属=数的各二进制位全部右移若干位,整数左补零,负数左补1,右边丢弃
7.三元运算符
7.1 基本语法
条件表达式 ? 表达式1 : 表达式2;
- 如果条件表达式为非0(真),运算后的结果是表达式1
- 如果条件表达式为0(假),运算后的结果是表达式2
7.2 案例演示
#include <stdio.h>
void main(){
int a = 10;
int b = 99;
int res = a > b?a++:b--;
int n1 = a>b?1.1:1.2;
printf("a=%d b=%d res=%d",a,b,res);
getchar();
}
7.3 使用细节
- 表达式一和表达式二要为可以赋给接收变量的类型(或可以自动转换),否则会精度损失
- 三元运算符可以转成if---else语句
int a = 10;
int b = 100;
int c = 199;
int max = a > b ? a : b;
int max2 = max > c ? max :c;
8.运算符优先级
8.1 优先级小结
- 结合的方向只有三个是从右向左,其余都是从左向右
- 所有的双目运算符只有赋值运算符的结合方向是从右向左
- 另外两个从右向左的运算符,一个是单目运算,一个是三目运算
- 逗号的运算符优先级最低
- 算数运算符>关系运算符>逻辑运算符(逻辑非!除外)>赋值运算符>逗号运算符
8.3 注意事项
- .的优先级高于*
- []高于*
- 函数()高于*
- ==和!=高于位操作
- ==和!=高于赋值符
- 算符运算符高于位移运算符
- 逗号运算符在所有运算符中优先级最低

浙公网安备 33010602011771号