C语言运算符、表达式相关知识

1. 同一优先级的运算符的运算次序

同一优先级的运算符,运算次序由结合方向决定。即:! > 算数运算符 > 关系运算符 > && > || > 赋值运算符。

2. 容易出错的运算符优先级

优先级问题表达式经常误认为的结果实际结果
. 的优先级高于 *, -> 操作符用于消除这个问题*p.fp所指duix对象的字段 f (*p) . f对 p 取 f 偏移,作为指针,然后进行接触引用操作。*(p.f)
[] 高于 *int *ap[]ap 是个指向 int 数组的指针 int (*ap)[]ap是个元素为 int 指针的数组 int *(ap[])
函数 () 高于 *int *fp()fp 是个函数指针,所指函数返回 int  int (*fp) ()fp 是个函数,返回 int *    int *(fp())
== 和 != 高于位操作(val & mask != 0)(val & mask) != 0val &(mask != 0)
== 和 != 高于fuzh赋值符c = getchar() != EOF(c = getchar() != EOF)c = (getchar() != EOF)
算数运算符高于移位运算符msb << 4 + lsb(msb << 4) + lsbmsb << (4 + msb)
逗号运算符在所有运算符中优先级最低I = 1,2i = (1,2)(i = 1),2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3. 条件运算符的使用

条件运算符为?和:,它是一个三目运算符。一般形式为:

表达式1?表达式2:表达式3

求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3作为条件表达式的值。

4. 条件表达式的注意点

1)条件运算符的yuns运算优先级低于关系运算符和算数运算符,但高于赋值符;

2)条件运算符 "?" 和 ":" 是一对运算符,不能分开单独使用;

3)条件运算符的结合方向是自右至左。

5. ++i 和 i++ 的区分与使用

简单来说:

++i :先自加,再运算;

i++ :先运算,再自加。

具体的说:

当 ++ 作为后缀时,遇到 :;函数括号 这三个结束标志时再自加。

例:(i++)+(i++)+(i++)+(i++) = 8

没有遇到结束符,i 不会自加

2+2+2+2=8

(++i)+(i++)+(++i)+(i++) = 16

3+3+4+4=16

6. 异或运算怎样交换两个变量的值

a=1;b=2;

进行操作:a=a^b;

                 b=a^b;

                 a=a^b;

运行之后,a=2;b=1;

7. 逻辑运算符的使用

int i=0;int j=0;

if((++1>0)11 (++j>0))

//打印出主和j的值。

结果: i=1; j=0。

逻辑运算符 || 两边的条件只要有一个为真,其结果就为真;只要有一个结果为假,其结果就为假。"if((++i >0) || (++j > 0))"语句中,先计算(++i>0), 发现其结果为真,后面的 (++j > 0) 便不再计算。同样&&运算符也要注意这种情况。

8. 按位与运算及应用

按位与运算符“&”是双目运算符。其功能是参与运算的两个数字对应的二进制位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。

例:9&5 可写为算式:

00001001 (9的二进制补码) & 00000101 (5的二进制补码)

00000001 (1的进制补码)

按位与运算通常用来对某些位清 0 或保留某些位。例如,把 a 的高 8 位清 0,保留低 8 位,可作 a & 255 运算(255 的二进制数为0000000011111111)

应用:

1)清 0 特定位 (mask 中特定位置 0,其他位为1,s = s&mask)。

2)取某数中指定位 (mask 中特定位置1,其他位为0,s = s&mask)。

9. 按位异或运算及应用

按位异或运算符 "^" 是双目运算符,其功能是参与运算的两个数字对应的二进制位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现。

例:9^5可写成算式:

0001001^00000101      00001100 (十进制为12)

应用:

1)使特定位的值取反 (mask中特定位置1,其他位为0,s=s^mask)。

2)不引入第三变量,交换两个变量的值。

10. << , >> 注意点

右移运算符“>>”是双目运算符,其功能是把“>>”左边的运算数的各二进制位全部右移若干位,“>>”右边的数指定移动的位数。但注意:对于有符号数,在右移时,符号位将随同移动,当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值