运算符与表达式

1. 运算符
什么是运算符?
用来进行某种运算的符号。

如: + - * / %

a、几目运算符 : 该运算符带有几个操作数
单目运算符: 该运算符需要一个操作数。
如: ++ –
双目运算符: 该运算符需要两个操作数。
如: + - * / %
三目运算符: 该运算符需要三个操作数。
如: a ? b : c

*b、结合性 :*决定先算谁后算谁
从左至右结合,从右至左结合

如:
+ 结合性: 从左至右结合 a + b :
先算表达式a的值,再算表达式b的值
最后把 a + b

在C语言中 a + b 和 b + a 表达的含义是不一样:

例子:
int i = 5 , j = 6;
(i++) + (i + j)
(i + j) + (i++)

c、优先级: 在一个含有多个运算符的表达式中,先算哪个运算符
后算哪一个运算符。

单目运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 条件运算符 > 赋值运算符 > 逗号运算符

(1) 算术运算符 : 进行算术运算的运算符
++ – : 单目运算符
* / % + - : 双目运算符,结合性从左至右
% : 求余,取模。要求两个操作数都必须是整数!!
++ : 自增运算符 i++ ++i
– : 自减运算符i-- --i
++ – 单目运算符,要求操作数必须为一个“左值”
例子: 变量是具备左值的
常量/表达式的值 不具备左值
5++ ERROR
(a+b)++ ERROR
(a++)++ ERROR
a++ OK

(2) 关系运算符
用来判断两个东西关系的运算符。
“关系” : 数值大小关系

	< <= > >= 
	==  != 
	都是属于双目运算符,结合性从左至右
	
	关系表达式: 用关系运算符连接起来的式子。
	
	关系表达式的值:
		"关系成立"  => 1 
		"关系不成立" => 0

(3) 逻辑运算符 : 用来描述逻辑关系的运算符

	!    逻辑非  单目运算符    “取反”
	&&   逻辑与  双目运算符    “并且”  从左至右 
		a  &&  b  => 结果 
		真     真     真 
		假     真     假 
		真     假     假
		假     假     假
		
	||   逻辑或  双目运算符    “或者”  从左至右  
		a  ||  b  => 结果 
		真     真     真 
		假     真     真 
		真     假     真
		假     假     假
	
	逻辑表达式: 用逻辑运算符连接起来的式子。
	逻辑表达式的值: 
		逻辑真 (非0) 
		逻辑假  0 

:C语言中,运算符的“惰性运算”:
(1) a && b && c
只要a为假,后面的b,c就不需要计算啦
只有a为真,这个时候才需要去判断b的值
只有a和b都为真的时候,才需要去判断c的值
(2) a || b || c
只要a为真,就不需要判断b和c的值
只有a为假时,才需要判断b的值
只有a和b都为假的时候,才需要去判断c的值

(4) 位运算符
位运算符是指按bit位来进行的运算。
位运算符要求操作数是整数。
有如下:
& 按位与
| 按位或
^ 按位异或
~ 按位取反
<< 按位左移
>> 按位右移
: 除了~是单目运算符外,其他的位运算符都是双目运算符,
结合性都是从左至右。
位运算符操作数只能是整数(整型,字符型)
所有位运算都需要把操作数变成bit序列,然后再按bit位来进行运算。

~ 按位取反 :单目运算符
& (按位与) : “与”
a b a&b
1 1 1
1 0 0
0 1 0
0 0 0
&如果两个bit位操作数都为1,结果才为1,否则为0.
结论:
一个bit与0进行“按位与”的操作,其结果为0,
一个bit与1进行“按位与”的操作,其结果保留其原值!
| (按位或) :双目运算符,结合性从左至右
a b a|b
1 1 1
1 0 1
0 1 1
0 0 0
| 按位或,只要由一个Bit操作数为1,其结果就为1.
结论:
一个bit与0进行“按位或”的操作,其结果为原值,
x | 0 => x
一个bit与1进行“按位或”的操作,其结果为1。
x | 1 => 1
^ (按位异或) :
“异或” :求异,不同为1,相同为0
a b a^b
1 1 0
1 0 1
0 1 1
0 0 0
结论:
一个bit与0进行“按位异或”的操作,其结果保留其原值,
x ^ 0 => x
一个bit与1进行“按位异或”的操作,其结果取反。
x ^ 1 => ~x

<< : 按位左移: 按bit位整体往左移
a << n : 把a按bit位整体往左移n位。
高位左移后,直接舍弃;
低位会空出n个bit位,直接补0.
注意:
对于无符号的数来说,如果左移后舍弃的高位全部都是0,那么左移n位,
得到的结果会是在原值的基础上面 乘以2的n次幂。

>> 按位右移 : 按Bit位整体右移
a >> n : 把a按bit位整体往右移n位。
低位右移后,直接舍弃,
对于无符号的数,高位全部补0;
对于有符号的数,高位全部补符号位。

(5) 赋值运算符
= :双目运算符,结合性从右至左,
优先级排倒数第二,仅比逗号高。

	a = x : 
		把表达式x的值,赋值给a。
		赋值运算符要求 左边的操作数必须为一个“左值”!!
		例子: 
			5 = 5; //ERROR
			2 + 3 = 5 ; //ERROR
			i++ = 6; //ERROR
			i = 6 ; // OBJK  

赋值表达式: 由赋值运算符连接起来的式子 
赋值表达式的值: 
	赋值表达式的值 就是 最后赋值给左边变量的值。
	
	a = b = 5  
		=> a = (b = 5)
		把表达式(b = 5)的值,赋值给a.

复合赋值运算符:
赋值运算符可以和算术运算符、位运算符 组成复合的赋值运算符。

		+= -= *= =%=
		
		&= |= ~= ^= <<= >>= 
		
	例子: 
		a += 5 
			<=> a = (a + 5) 
			
		a += 5 + 6 
			<=> a = (a + (5 + 6)) 
			
		a |= 5 
			<=> a = a | 5  

(6) 条件运算符
? : 三目运算符
expression ? a : b
上面是一个条件表达式,
如果表达式expression值为真,则整个表达式的结果为a;
如果表达式expression值为假,则整个表达式的结果为b。
注:惰性运算

(7) 逗号运算符 :
双目运算符,结合性从左至右,优先级是最低。
表达式1 , 表达式2
逗号表达式求值的顺序:
先求表达式1的值,然后再求表达式2的值,
最终整个逗号表达式的值就是表达式2的值!
逗号表达式的扩展形式:
表达式1,表达式2,…,表达式n
求值顺序:
先求表达式1的值,然后再求表达式2的值,…,最后再求表达式n的值,整个逗号表达式的值就是表达式n的值!

(8) 指针运算符
*
& : 取地址符,单目运算符
&对象名 : 取“对象”的地址

		例子: 
			int a; 
			scanf("%d", &a); 

(9) 求字节运算符 sizeof
单目运算符,求一个对象或类型所占空间的字节数。

	sizeof(x) : 
		=> sizeof(typeof(x))
		x可以是某某对象(变量、常量、数组 ==)
		x也可以是某某类型。 
		sizeof 不要求x存在,但是要求x的类型一定是确定,
		因为我们只需要知道x的类型,那么就能够知道x所占的
		字节大小啦!! 

(10) 分量运算符
求结构体中成员变量(分量)
.
->
(11) 下标运算符
[]
int a[10];
a[0]
a[1]

a[9]
(12) 强制类型转换运算符
(类型)
如:
(unsigned char)255

2. 表达式 expression
什么是表达式?
表达式就是表达某个意思的式子。
在C语言中,任意合法的表达式都会有一个值!!
那么这个值,其实就是表达式需要表达的意思。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ChampLixxx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值