运算符和表达式
1、基本的概念
运算符: 也可以叫做操作赋 就是一种执行运算的特定符号
ex: - * /
操作数:就指指定运算符 运算的数据
ex: 1 2 中的 1 2 都是操作数
表达式: 由操作数与运算符组成的能够计算唯一结果的式子叫做表达式
这个唯一的结果叫做表达式的值!
ex: 2 1=3;
2 1 就是一个表达式 这个表达式的值就是3
C语言中的运算符 按照功能分分为以下几种:
算术运算符
赋值运算符
关系运算符
逻辑运算符
位运算符
条件运算符
逗号运算符
其他运算符
C语言中按照操作数的个数分类 分为以下几种:
单目运算符 即只有1个操作数
双目运算符 即只能有2个操作数
三目运算符 即只有3个操作数 C语言中唯一有一个就是条件运算符
2、算术运算符
2.1 双目运算符
- * / % 结合性从左到右
ex: 1 2 3-6 从左往右算 就是结合性!
注意: 两个不同类型的数据进行运算 结果是大的那个数据类型
整型 与 整型 运算 结果依然是整型
整型 与 浮点 运算 结果是浮点型
浮点 与 整型 运算 结果是浮点型
浮点 与 浮点 运算 结果是浮点型
如果 short 和 char 运算 结果是 short
*** 无符号的范围大于有符号的范围
无符号整型 与 有符号整型运算 结果 是无符号的
ex: int a = 10;
char c =5;
a c的结果为15 类型为 int
int a = 10;
long l = 20;
a l => long long比int大 但是 32位机没区别 64位就有
/ 对于整数运算而言 不是除 叫做求商
ex: 3/2 结果位 1 商为 1
对于浮点数据运算而言 就是除
ex: 3/2 结果为 1.500000
% 比较特殊 其两个操作数 必须都是整数
ex: 3%2 结果为1 因为是商1 余1 这里取的是 余数
—————不开辟空间 交换a = 5,b =6;的值 ( - * ^ 都可,/不行)
int a=5,b=6; int a=5,b=6;
a = a b; //a = 11,b = 6 a = a-b; //a = -1, b = 6
b = a-b; //b = 5, a = 11 b = a b; //a = -1, b = 5
a = a-b; //a = 6, b = 5 a = b-a; //a = 6, b = 5
char a = 5,b = 6; int a=5,b=6;
a = a^b; //a = 3, b= 6; a = a*b; //a = 30,b = 6
b = a^b; //a = 3,b = 5; b = a/b; //a = 30,b = 5
a = a^b; //a = 6,b = 5; a = a/b; //a = 6, b = 5
练习:请输入一个3位数 将这个三位数的 个 十 百位分别取出 并倒置输出
ex: 输入: 123 输出: 321
int num;
scanf("%d",&num);
int ge,shi,bai;
ge = num/1;
shi= num/10;
bai = num/100
printf("%d%d%d\n",ge,shi,bai);
2.2 单目运算符
--
注意:使用 -- 运算符的使用其操作数只能是变量 不能是常量
ex: int a = 10;
a ; =>相当于 a = a 1;
2 ; => 相当于 2 = 2 1 ; 2是常量值不可以更改
区别:后缀:i ,i-- 都是先引用再运算
前缀: i,--i 都是先运算后引用
练习: int x = 2;
int y =(x ) ( x) (x )-(x )
x 3 4 5 6
表达式 2 4 4 - 5
求y的值 5
3、赋值运算符
包括 = = -= /= *= %= 都是双目运算符 结合性从右往左
练习: int c = 2;
int a,b;
a = b = 10%c=6; //表达式不对,先做10%c结果为0,0是一个常量不能被赋值
说明 优先级: 算术优先级 > 赋值
4、关系运算符 用于判断两个数据之间的关系的 均为双目运算符 结合性从左到右
> < == != >= <=
ex: int a = 5>3; //a = 1
因为关系运算符就相当于条件 成立则其真值为 1 否则真值为 0
那则有一个重要的点: 在C语言中 !0 即为真 只有0才为假
5、逻辑运算符 即求条件的真值 逻辑只有两个值 要么成立 用1 要么不成立用 0
5.1、单目运算符
只有一个 ! 非
相当于 逻辑反 即如果条件为真 取非 变为 假 !1 结果为 0
如果条件变为假 取非 变为 真 !0 结果为 1
5.2、双目运算符
&& ||
&& 逻辑与:只有当两个同为真才能为真
|| 逻辑或:只要有一个为真则为真 同为假才能为假
ex: 输入一个年份判断这个年份是不是闰年
能够被4整除 但不能 100整除 或者 能够被400整除
year%4==0 && year0!=0 || year@0==0 //结合成立才为闰年
优先级: !> 算术 > 关系 > && > || >赋值
关于优先级 没必要死记硬背 不知道就加() 即可
/**********************/
惰性运算:(注意:惰性运算 高于一切
即在程序的执行过程中
&& 前面的表达式为假了 整个表达式都会为假 后面的就不做了
前面的为假 后面的就不做了
|| 前面的表达式为真了 表示已经有一个为真了 则后面的就不做了
前面的为真 后面的就不做 了
6、二进制的位运算
6.1 单目运算符
~ 按位取反
6.2 双目运算符 (包括 & | ^ << >>
& 按位& 遵守规则 0与任何数都得0 1与任何数都得任何数
| 按位| 遵守规则 1或任何数都得1 0或任何数都得任何数
^ 按位异或 即相同为 0不同为 1
<< 按位整体左移:高位移出则丢弃 低位补0(左移一位在没有溢出的情况下相当于*2
>> 按位整体右移 低位移出则丢弃 高位遵守以下规则
逻辑右移:不考虑符号位 即对于无符号数据而言 高位统一默认补0 低位丢弃
算术右移:需要考虑符号位 即对于有符号数据而言 高位补符号位 低位丢弃
ex: char c = 128;
c = c >> 2;
1000 0000 >>2
10 0000 00
--空缺 -- 移出
高位补符号位 而之前的的符号位为1
1110 0000
符号位为1 表示为 - 所以是补码
-1 1101 1111
~ 0010 0000 =》2^5 = 32 =》-32
7、逗号运算符 是一个双目运算符 结合性 从左到右
格式:
表达式1,表达式2,表达式3,.....,表达式n;
求解的过程:先求解表达式1 再求解表达式 2 ...
整个逗号表达式的值 就是最后一个表达式的值
ex: int f = (2,6,9); 对的 这是一个赋值表达式
这个赋值表达式 的值为 (2,6,9)这个逗号表达式的值!
8、条件运算符:
C语言中唯一的一个三目运算符 类似于:if else 的结构
格式:
表达式1?表达式2:表达式3;
语义:如果表达式1的值为真 则求解表达式2的值 此时整个条件表达式的值为表达式2的值
如果表达式1的值为假 则求解表达式3的值 此时整个条件表达式的值为表达式3的值
9、其他运算符: 部分仅作为了解
9.1 指针运算符 并且都是单目运算符
* 指向 & 取址
9.2 求数据类型的大小运算符 sizeof( ) ***
ex: sizeof(97) = 4
int a; sizeof(a) = 4
9.3 类型强转运算符
格式: (类型说明符)变量 or (类型说明符)常量
注意: 类型强转只能转值 不能转变量的类型
ex:
float f = 2.25;
int c = (int)f;
结果是 c = 2;
但是f的值没有变讲表达式引用的值的类型转了 但是数据并不改变
9.4 分量运算符
. 用于结构体 or 共用体成员的访问
-> 用于结构体 or 共用体成员的访问
9.5 下标运算符
[] 用于数组下标
/*********************************************************
表达式:做什么运算就是什么表达式
关系运算
a>b 这个表达式叫做 关系表达式
最后的运算做什么整个就叫做什么表达式 (哪个运算符优先级最低就是什么表达式
x = a > b && b < c; // 最后做赋值 所以 叫做赋值表达式
x = (2,3,5); //这是赋值表达式
a=2,c=6; //逗号表达式
所有合法的表达式都有 一个指定的值 这个值叫做 表达式的值!
************************************************************/