运算符和表达式

关于这一章节的东西,也是学编程的一个很基础的东西,每个语言也都会有,这里记录一些比较重要的知识点,好了进入正题:

运算符可以有如下几种分法:

下面对其一一进行学习:

算术运算符:
① ++--运算符前置和后置有很大区别
 

 运行结果:

理解:

对于表达式,需知道它对应于一个唯一的值,而++i和i++都属于表达式,对于i++的值可以这样理解:

int tmp = i;
i = i+1;
return tmp;

而对于++i表达式的值,实际上就是改变的i的值:

i = i+1;
return i;

 ②类型转换:

  运算符的操作数属于不同的数据类型,运算时通常会将这些操作数转换为同一类型,由编译系统自动完成
  在赋值表达式中,自动将赋值运算符右边表达式的值的类型转换成左边变量的类型
  级别高低:char->short->int->long->float->double->long double,由低级别的自动转化成高级别的类型
下面用一个表达式的计算过程图能清晰的表达类型转换的意义:
③优先级:
运行结果:
这个比较容易理解,而对于一元运算符的优先级呢?这里举一个例子:
      *p++
因为*、++是同级别的运算,所以这时按结合性来计算,而它属于一元,是按从右到左的顺序:
 
所以:
*p++ = *(p++) != (*p)++
 
赋值运算符:
赋值运算符的优先级低于算术运算符,仅高于逗号运算
 
关系运算符:
在c语言中没有布尔类型,0表示假,1表示真:
 
逻辑运算符:
 
下面来看两个例子:
说明:
1、++算术运算符比逻辑运算符||、&&优先级要高
2、&&优先级要与||高
3、由于||如果左边值为true,则会短路,所以++x=1,为逻辑真了,所以||右边的表达式就没有计算了。
说明:
1、(++x||++y)有短路,所以++y并没有计算,
2、&&如果左边为false,则也会短路,而由于上面表达式中为true,所以,++z会执行到。
位运算符:
将数字转换成二进制形式后再按位处理
 
其中说明一下右移操作:
运行结果:
以十六进制的形式输出:
运行结果:
为了让十六进制更加清晰,前面加一个ox前缀:
输出如下:
这时,将它往右移8位
分析:
如果是有符号数,那又是怎么样的呢?
C语言中的右移分为逻辑右移算术右移:
逻辑右移:高位补0(对于无符号数来说,>>是指逻辑右移)
算术右移:保留符号位不变(对于正数,高位补0;对于负数,高位补1)
实际上,C语言并没有规定有符号数的>>是逻辑右移还是算术右移,但是,几乎所有的编译器将有符号数的>>都实现成了算术右移了。
 
知道了上面的位运算,下面用一个实际例子,来将其运用一下:
 
说明:x >> 8 & 0xFF,为什么还要与上0xFF,是为了有可能是算术右移,高位补1(虽说我们这个例子符号位是0),所以这样是为了保证将高八位全去掉】
下面举一些位运算的例子:
其中~10为什么是-11呢,原因如下:
位运算符优先级:
位运算示例【这个在实际当中都会用到的,争取要记住】:
 
解析:
下面这两个位操作,是会经常用到的【重要】
关于这两个位运算的应用,在博文:http://www.cnblogs.com/webor2006/p/3500354.html有用到,一般是用来设置状态,并清除状态
 
这个也是上面提到过的,下面我们来论证一下该等式:
上面这是求一个正数的取反操作,那如果对一个负数进行取反,该等式也成立么,先用代码看下结果:
 
下面关于运算符的优化级进行一个总结:
 
 
下面对所有运算符的优化级进行一个总结,以便之后对优化级有疑惑时来进行查找:
以一个范例来说明一下优先级:
 
修改优先级:
 
下面来使用一下三目及逗号运算符:
编译运行:
注意:printf("%d\n",1,2,3);并非是逗号表达式,而是函数的参数传递】
常见的一些优先级错误:
 
建议:关于表达式的优级,只要把握“算术运算符优先级高于关系运算符高于逻辑运算符高于赋值运算符"原则,并记住上面经常范的错误,就能搞定它了!】

posted on 2013-11-24 14:55  cexo  阅读(497)  评论(0编辑  收藏  举报

导航