操作符与表达式易错点总结

1、 赋值操作符
a =x=b+3;
这条语句中,认为a和x被赋予相同的值是错误的。因为当a是char型,x是int型,那么x变量就被截短。
2、 新手容易犯在条件比较本来用==,却写成=,然后编译不会报错。因为这并不是一个语法错误,是一个合法的表达式。
3、 左值和右值
左值就是出现在赋值操作符的左边的东西,右值就是出现在赋值操作符的右边的东西。
能用右值的地方都可以用左值,但是用坐值的地方不能用右值
4、 表达式求值
(1) 表达式求值隐含类型强制转换
例如:
Char a,b,c
……
a = b+c;
b ,c被提升为普通整型,然后执行加法运行,其结果如果超过8位,在赋予a时候,将被截短。这个结果与8位运算是一样的。但是下面这个例子就不相同了。
A = (~a^b << 1) >> 1;
由于存在取反和左移的操作,所以8位会溢出。
(2) 算术转换
如果某个操作符的各个操作数类型不同时,那么除非其中一个操作数类型转换成另一个操作数的类型,否则,无非进行计算。下面的算术转换:
long double
double
float
unsigned long int
long int
unsigned int
int
如果两个操作数类型不同,则按上面的高低列表,低的操作数向高的转换。
注意:
Int a=5000;
Int c=25;
Long b;
b = ac;
如果运行在32位机器上,没有问题。但是运行在16位机器上就会溢出。
改进:b = (long)a
c;
5、 操作符的属性
复杂的表达式求值顺序有三个因素决定:
操作符优先级、操作符的结合性、操作符是否控制执行顺序

运算符优先级和结合性一览表

两个相邻的操作符执行顺序由优先级决定,优先级相同,则按结合性。除此之外,编译器可以自由决定使用任何顺序进行求值,只要不违法逗号运算符、&& 、|| ?:的限制。

优先级运算符名称或含义使用形式结合方向说明
1[]数组下标数组名[常量表达式]左到右
()圆括号(表达式)
函数名(形参表)
.成员选择(对象)对象.成员名
->成员选择(指针)对象指针->成员名
2-负号运算符-表达式右到左单目运算符
(类型)强制类型转换(数据类型)表达式
++自增运算符++变量名单目运算符
变量名++
--自减运算符--变量名单目运算符
变量名--
*取值运算符*指针变量单目运算符
&取地址运算符&变量名单目运算符
!逻辑非运算符!表达式单目运算符
~按位取反运算符~表达式单目运算符
sizeof长度运算符sizeof(表达式)
3/表达式 / 表达式左到右双目运算符
*表达式*表达式双目运算符
%余数(取模)整型表达式%整型表达式双目运算符
4+表达式+表达式左到右双目运算符
-表达式-表达式双目运算符
5<< 左移变量<<表达式左到右双目运算符
>> 右移变量>>表达式双目运算符
6> 大于表达式>表达式左到右双目运算符
>=大于等于表达式>=表达式双目运算符
< 小于表达式<表达式双目运算符
<=小于等于表达式<=表达式双目运算符
7==等于表达式==表达式左到右双目运算符
!=不等于表达式!= 表达式双目运算符
8&按位与表达式&表达式左到右双目运算符
9^按位异或表达式^表达式左到右双目运算符
10|按位或表达式|表达式左到右双目运算符
11&&逻辑与表达式&&表达式左到右双目运算符
12||逻辑或表达式||表达式左到右双目运算符
13?:条件运算符表达式1? 表达式2: 表达式3右到左三目运算符
14=赋值运算符变量=表达式右到左
/=除后赋值变量/=表达式
*=乘后赋值变量*=表达式
%=取模后赋值变量%=表达式
+=加后赋值变量+=表达式
-=减后赋值变量-=表达式
<<=左移后赋值变量<<=表达式
>>=右移后赋值变量>>=表达式
&=按位与后赋值变量&=表达式
^=按位异或后赋值变量^=表达式
|=按位或后赋值变量|=表达式
15,逗号运算符表达式,表达式,…左到右

一些容易出错的优先级问题

优先级问题表达式经常误认为的结果实际结果
. 的优先级高于 *(-> 操作符用于消除这个问题)*p.fp 所指对象的字段 f,等价于:对 p 取 f 偏移,作为指针,然后进行解除引用操作,等价于:
(*p).f*(p.f)
[] 高于 *int *ap[]ap 是个指向 int 数组的指针,等价于:ap 是个元素为 int 指针的数组,等价于:
int (*ap)[]int *(ap [])
函数 () 高于 *int *fp()fp 是个函数指针,所指函数返回 int,等价于:fp 是个函数,返回 int*,等价于:
int (*fp)()int* ( fp() )
== 和 != 高于位操作(val & mask != 0)(val &mask) != 0val & (mask != 0)
== 和 != 高于赋值符c = getchar() != EOF(c = getchar()) != EOFc = (getchar() != EOF)
算术运算符高于位移 运算符msb << 4 + lsb(msb << 4) + lsbmsb << (4 + lsb)
逗号运算符在所有运 算符中优先级最低i = 1, 2i = (1,2)(i = 1), 2
参考:[C语言运算符优先级和结合性一览表](http://c.biancheng.net/view/161.html)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值