目录
4.关系运算符与关系表达式
5.逻辑运算符与逻辑表达式
6.逗号运算符与逗号表达式
例题6:逗号运算符的使用
7.条件运算符与条件表达式
8.位运算符
例题7:按位与运算
例题8:按位或运算
例题9:按位异或运算
例题10:左移运算:
例题11:位综合运算:
9.各类基本数据类型数据间的混合运算
例题12:自动转换:
例题13:强制转换
10. 运算符的优先级
C语言程序设计笔记4——C的运算符与表达式(上)链接:http://t.csdnimg.cn/jlI1q
4.关系运算符与关系表达式
>= < ==(等于) !=(不等于)
比较两个运算量的大小(注意运算符的优先级),==和!=的优先级小于前面四个,且低于算术运算符但高于赋值运算符。
5.逻辑运算符与逻辑表达式
逻辑运算是指用形式逻辑原则来建立数值间的关系,逻辑与、逻辑或、逻辑非;
! | 逻辑非:对真取非结果假,对假取非结果真,C语言中非0为真1,非其他为假0) | !20结果0; !0结果1; |
&& | 逻辑与:表示两个运算对象都为真结果才为真 | 20&&25结果1; 20&&0结果0; |
|| | 逻辑或:表示两个运算对象中有一个真结果就为真 | 20||0结果1; 0||0结果0; |
其中&&和||为二元运算符,优先级低于关系运算符,结合方向为自左向右,先计算左表达式的值,当左表达式的值能确定整个表达式的值时,就不再计算右边表达式的值。!为一元运算符,高于关系运算符,结合方向为自右向左。
关系运算符和逻辑运算符的真假概念:逻辑真值可以是不为0的任何值,逻辑假值则为0 。若表达式为真则表达式值为1否则为0
例如:!1&&0 由于!比&&优先级高所以先求 !1
6.逗号运算符与逗号表达式
功能是把两个表达式连接起来组成一个表达式,称为逗号表达式,按顺序分别求每个表达式的值,并以最后一个表达式的值作为整个逗号表达式的值。程序中使用逗号表达式,通常是通常是分别求逗号表达式中的各个值并不一定要求整个逗号表达式的值。并不是所有出现逗号的地方都组成逗号表达式,如:在变量说明中函数参数表中的逗号只是用作各变量之间的间隔符。
一般形式:
表达式1,表达式2,…表达式n
例题6:逗号运算符的使用
#include main(){int a=2,b=4,c=6,x,y;x=a+b,y=b+c;printf("y=%d,x=%d",y,x);}
输出结果:
7.条件运算符与条件表达式
条件表达式是根据给定的逻辑表达式在两个表达式中取其中一个表达式的运算。若逻辑表达式的值为非0,则以表达式1的值为条件表达式的结果;否则以表达式2的值为条件表达式的结果,条件表达式为C语言中唯一的一个三元运算符。
逻辑表达式?表达式1:表达式2
如:“z=xch=(ch>=’a’&&ch<=’z’?ch+’A’-’a’:ch) 若字符变量ch为小写字母,则改为大写字母。
8.位运算符
前面已介绍的各种运算符都是以字节作为最基本位进行的,不过在计算机系统中常要求在位(bit)一级进行运算或处理,对象为二进制数
位运算符:
~ | 按位反 | ~1结果0 ~1010结果0101 |
& | 按位与 | 1100&1010结果1000 |
| | 按位或 | 1100|1010结果1110 |
^ | 按位异或 | 1100&1010结果0110 |
<< | 按位左移 | 0010结果0100 |
>> | 按位右移 | 0010结果0001 |
(1)按位与运算符“&”:双目运算符,参与运算的两数各对应的二进位相与,只有对应的两个二进制均为1时结果才为1否则为0,参与运算的数以补码的方式出现
如:9&5可写算式如下:
00001001 (9的二进制补码)
&00000101 (5的二进制补码)
00000001
则9&5=1
按位与运算通常用来对某些清0或保留某些位,例如:a&255(255的二进制数为0000000011111111)把a的高八位清0,保留低八位
例题7:按位与运算
#include main(){int a=9,b=5,c;c=a&b;printf("a=%d\nb=%d\nc=%d\n",a,b,c);}
输出结果:
(2)按位或运算符|:双目运算符,参与运算的两数各对应的二进制位相或,只要对应的两个二进位有一个为1,结果位就为1,参与运算的两个数均以补码的出现
例如:9|5算式如下:
00001001
| 00000101
00001101 (十进制为13)
例题8:按位或运算
#include main(){int a=9,b=5,c;c=a|b;printf("a=%d\nb=%d\nc=%d\n",a,b,c);}
输出结果:
(3)按位异或运算符^:双目运算符,参与运算的两数各对应的二进制位相异或,当两对应的二进位相异时,结果为1,参与运算数均以补码出现
例如:9^5
00001001
00000101
00001100 (十进制为12)
例题9:按位异或运算
#include main(){int a=9;a=a^5;printf("a=%d\n",a);}
输出结果:
(4)求反目运算符~:单目运算符,具有右结合性,功能是对参与运算的数的各二进位按位求反,例如:~9的运算为:~(0000000000001001)结果为:1111111111110110
(5)左移运算符<<:双目运算符,其功能是把<<左边的运算数的各二进位全部左移若干位,由<<右边的数指定移动的位数,高位丢弃低位补0.
例如:a<<4 a的各二进位向左移动4位,假如a=00000011(十进制3)左移四位后为00110000(十进制48)
(6)右移运算符>>:双目运算符,功能是把>>左边的运算数的各二进位全部右移若干,>>右边的数指定移动的位数,对于有符号数右移时符号位将随同移动,正数时最高位补0,当为负数时符号位为1,最高位是补0或是补1取决于编译系统的规定
例如:设a=15,则a>>2 表示把00001111右移00000011(十进制3)
例题10:左移运算:
#include main(){unsigned a,b;printf("input a number: ");scanf("%d",&a);b=a>>5;b=b&15;printf("a=%d\tb=%d\n",a,b);}
输出结果:
例题11:位综合运算:
#include main(){char a ='a',b='b';int p,c,d;p=a;p=(p<>8;printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);}
输出结果:
9.各类基本数据类型数据间的混合运算
1. 混合运算表达式
整型、字符型、实型数据间可以混合运算,运算时不同类型数据要转换成同一类型再运算,转换规则:char, short→int→unsigned→long→double←float
2. 数据类型的转换
不同类型的变量混合时的类型改变,在赋值语句中类型转换的规则:等号右边的值转换为等号左边变量所属的类型。
变量数据类型转换的两种方式:
(1)自动转换:
不同类型的量混合运算时,由编译系统自动完成
自动转换遵循以下规则:
若参与运算量的类型不同则先转换成同一类型,然后进行运算
转换按数据长度增加的方向进行,以保证数据的精度不降低,如int型和long型运算时先把int量转成long型后再进行运算
所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double类型,再做运算
在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量类型转化成左边量类型,如果右边量数据类型长度比左边长时会丢失部分数据,这样会降低精度,丢失部分按四舍五入向前舍入
例题12:自动转换:
#includemain(){float PI=3.14159;int s,r=5;s=r*r*PI;printf("s=%d\n",s);}
输出结果:
再执行s=r*r*PI语句时,r和PI都转换成double型计算,结果也为double型,由于s为整型所以赋值结果仍为整型,舍去了小数部分
(2)强制类型转换
强制转换是通过类型转换运算来实现,把表达式结果强制转换成类型说明符所表示的类型
一般形式:
(类型说明符)(表达式)
例如:(float)a 把a转换为实型
(int)(x+y) 把x+y的结果转化成整型
表达式是单个变量可以不加括号,强制转换和自动转换都不改变数据说明时对该变量定义的类型
例题13:强制转换
#include main(){float f=5.75;printf("(int)f=%d,f=%f\n",(int)f,f);}
输出结果:
10. 运算符的优先级
当一个表达式中有多个运算符参与运算时按优先级顺序进行运算,同一行优先级相同
运算符优先级(由高到地)
表达式 |
()小括号、[ ]数组下标、 .结构成员、->指针型结构成员 |
!逻辑非、-负号、++加1、–减1、&变量地址、*指针所指内容、type函数说明、sizeof长度计算 |
*乘、/除、%取模 |
<>位右移 |
<小于、大于、>=大于等于 |
==等于、!=不等于 |
&位与 |
^位异或 |
|位或 |
&&逻辑与 |
||逻辑或 |
?:问号表达式 |
=、+=、-+、*=、/= |
,逗号运算符 |