C语言运算符大全Word下载.docx
《C语言运算符大全Word下载.docx》由会员分享,可在线阅读,更多相关《C语言运算符大全Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
强迫某个运算或某组运算的优先级升高。
2.6.3关系和逻辑运算符
关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”二字指的是连接关系的方式。
因为关系和逻辑运算符常在一起使用,所以将它们放在一起讨论。
关系和逻辑运算符概念中的关键是True(真)和Flase(假)。
C语言中,非0为True,0为Flase。
使用关系或逻辑运算符的表达式对Flase和Ture分别返回值0或1(见表2-6)。
表2-6给出于关系和逻辑运算符,下面用1和0给出逻辑真值表。
关系和逻辑运算符的优先级比算术运算符低,即像表达式10>
1+12的计算可以假定是对表达式10>
(1+12)的计算,当然,该表达式的结果为Flase。
在一个表达式中允许运算的组合。
例如:
10>
5&
&
!
(10<
9)||3<
=4
这一表达式的结果为True。
下表给出了关系和逻辑运算符的相对优先级:
最高!
!
>
=<
=
===!
=&
最低||同算术表达式一样,在关系或逻辑表达式中也使用括号来修改原计算顺序。
切记,所有关系和逻辑表达式产生的结果不是0就是1,所以下面的程序段不仅正确而且
将在屏幕上打印数值1。
intx;
x=100;
printf("
%d"
x>
10);
2.6.4位操作符
与其它语言不同,C语言支持全部的位操作符(BitwiseOperators)。
因为C语言的设计目的是取代汇编语言,所以它必须支持汇编语言所具有的运算能力。
位操作是对字节或字中的位(bit)进行测试、置位或移位处理,这里字节或字是针对C标准中的char和int数据类型而言的。
位操作不能用于float、double、longdouble、void或其它复杂类型。
表2-7给出了位操作的操作符。
位操作中的AND、OR和NOT(1的补码)的真值表与逻辑运算等价,唯一不同的是位操作是逐位进行运算的。
如表2-8所示,当且仅当一个操作数为True时,异或的输出为True,否则为Flase。
位操作通常用于设备驱动程序,例如调制解调器程序、磁盘文件管理程序和打印机驱动程序。
这是因为位操作可屏蔽掉某些位,如奇偶校验位(奇偶校验位用于确保字节中的其它位不会发生错误通常奇偶校验位是字节的最高位)。
通常我们可把位操作AND作为关闭位的手段,这就是说两个操作数中任一为0的位,其结果中对应位置为0。
例如,下面的函数通过调用函数read_modem(),从调制解调器端口读入一个字符,并将奇偶校验位置成0。
字节的位8是奇偶位,将该字节与一个位1到位7为1、位8为0的字节进行与操作,可将该字节的奇偶校验位置成0。
表达式ch&
127正是将ch中每一位同127数字的对应位进行与操作,结果ch的位8被置成了0。
在下面的例子中,假定ch接收到字符"
A"
并且奇偶位已经被置位。
一般来说,位的AND、OR和XOR操作通过对操作数运算,直接对结果变量的每一位分别处理。
正是因为这一原因(还有其它一些原因),位操作通常不像关系和逻辑运算符那样用在条件语句中,我们可以用例子说明这一点:
假定X=7,那么x&
8为Ture
(1),而x&
8却为Flase(0)。
记住,关系和逻辑操作符结果不是0就是1。
而相似的位操作通过相应处理,结果可为任意值。
换言之,位操作可以有0或1以外的其它值,而逻辑运算符的计算结果总是0或1。
移位操作符>
和<
<
将变量的各位按要求向或向左移动。
右移语句通常形式是:
variable>
右移位数
左移语句是:
variable<
左移位数
当某位从一端移出时,另一端移入0(某些计算机是送1,详细内容请查阅相应C编译程序用户手册)。
切记:
移位不同于循环,从一端移出的位并不送回到另一端去,移去的位永远丢失了,同时在另一端补0。
移位操作可对外部设备(如D/A转换器)的输入和状态信息进行译码,移位操作还可用于整数的快速乘除运算。
如表2-9所示(假定移位时补0),左移一位等效于乘2,而右移一位等效于除以2。
每左移一位乘2,注意x<
2后,原x的信息已经丢失了,因为一位已经从一端出,每右移一位相当于被2除,注意,乘后再除时,除操作并不带回乘法时已经丢掉的高位。
反码操作符为~。
~的作用是将特定变量的各位状态取反,即将所有的1位置成0,所有的0位置成1。
位操作符经常用在加密程序中,例如,若想生成一个不可读磁盘文件时,可以在文件上做一些位操作。
最简单的方法是用下述方法,通过1的反码运算,将每个字节的每一位取反。
原字节00101100
第一次取反码11010011
第二次取反码00101100
注意,对同一行进行连续的两次求反,总是得到原来的数字,所以第一次求反表示了字
节的编码,第二次求反进行译码又得到了原来的值。
可以用下面的函数encode()对字符进行编码。
2.6.5?
操作符
C语言提供了一个可以代替某些if-then-else语句的简便易用的操作符?
该操作符是三元的,其一般形式为:
EXP1?
EXE2:
EXP3
3
EXP1,EXP2和EXP3是表达式,注意冒号的用法和位置。
操作符“?
”作用是这样的,在计算EXP1之后,如果数值为True,则计算EXP2,并将结果作为整个表达式的数值;
如果EXP1的值为Flase,则计算EXP3,并以它的结果作为整个表达式的值,请看下例:
y=x>
9?
100:
200;
例中,赋给y的数值是100,如果x被赋给比9小的值,y的值将为200,若用if-else语句改写,有下面的等价程序:
if(x>
9)y=100;
elsey=200;
有关C语言中的其它条件语句将在第3章进行讨论。
2.6.6逗号操作符
作为一个操作符,逗号把几个表达式串在一起。
逗号操作符的左侧总是作为void(无值),这意味着其右边表达式的值变为以逗号分开的整个表达式的值。
x=(y=3,y+1);
这行将3赋给y,然后将4赋给x,因为逗号操作符的优先级比赋值操作符优先级低,所以必须使用括号。
实际上,逗号表示操作顺序。
当它在赋值语句右边使用时,所赋的值是逗号分隔开的表中最后那个表达式的值。
例如,
y=10;
x=(y=y-5,25/y);
执行后,x的值是5,因为y的起始值是10,减去5之后结果再除以25,得到最终结果。
在某种意义上可以认为,逗号操作符和标准英语的and是同义词。
2.6.7关于优先级的小结
表2-10列出了C语言所有操作符的优先级,其中包括将在本书后面讨论的某些操作符。
注意,所有操作符(除一元操作符和?
之外)都是左结合的。
一元操作符(*,&
和-)及操作符“?
”则为右结合。
C语言共有34个运算符,今天闲来没事就找了一下,现在拿出来分享一下呵:
按优先级排序,空行表示优先级下降,01为最高,最先算
14~31均为双目,左结合
()01.圆括号
[]02.下标
->
03.指针型结构成员
.04.结构成员
05.逻辑非
~06.位非
++07.自增
--08.自减
-09.取负
(类型)10.类型转换
*11.取内容
12.取地址
sizeof13.求字节
此级(5~13)均为单目运算,且都为右结合
*14.乘
/15.除
%16.求余
+17.加
-18.减
19.左移
20.右移
21.小于
=22.小于等于
23.大于
=24.大于等于
==25.等于
=26.不等于
27.位与
^28.位异或
|29.位或
30.与
||31.或
?
:
32.条件运算
此级(32)为三目运算,右结合
=33.赋值运算
另有10个扩展符+=,-=,*=,/=,%=,>
=,<
=,&
=,^=,|=
34.逗号运算
运算符
解释
结合方式
()[]->
.
括号(函数等),数组,两种结构成员访问
由左向右
~++--+-
*&
(类型)sizeof
否定,按位否定,增量,减量,正负号,
间接,取地址,类型转换,求大小
由右向左
*/%
乘,除,取模
+-
加,减
>
左移,右移
<
=>
小于,小于等于,大于等于,大于
==!
等于,不等于
按位与
^
按位异或
|
按位或
逻辑与
||
逻辑或
:
条件
=+=-=*=/=
=^=|=<
各种赋值
逗号(顺序)
上面给出的是其运算符,下面给出32个关键字及其含义:
auto:
声明自动变量一般不使用
double:
声明双精度变量或函数
int:
声明整型变量或函数
struct:
声明结构体变量或函数
break:
跳出当前循环
else:
条件语句否定分支(与if连用)
long:
声明长整型变量或函数
switch:
用于开关语句
case:
开关语句分支
enum:
声明枚举类型
register:
声明积存器变量
typedef:
用以给数据类型取别名(当然还有其他作用)
char:
声明字符型变量或函数
extern:
声明变量是在其他文件正声明(也可以看做是引用变量)
return:
子程序返回语句(可以带参数,也看不带参数)
union:
声明联合数据类型
const:
声明只读变量
float:
声明浮点型变量或函数
short:
声明短整型变量或函数
unsigned:
声明无符号类型变量或函数
continue:
结束当前循环,开始下一轮循环
for:
一种循环语句(可意会不可言传)
signed:
生命有符号类型变量或函数
void:
声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)
default:
开关语句中的“其他”分支
goto:
无条件跳转语句
sizeof:
计算数据类型长度
volatile:
说明变量在程序执行中可被隐含地改变
do:
循环语句的循环体
while:
循环语句的循环条件
static:
声明静态变量
if:
条件语句
C语言运算符分类
1级优先级(左结合)
()圆括号;
[]下标运算符;
指向结构体成员运算符;
.结构体成员运算符。
2级优先级(右结合)
!
逻辑非运算符;
~按位取反运算符;
++前缀增量运算符;
--前缀减量运算符;
+正号运算符;
-负号运算符;
(类型)类型转换运算符;
*指针运算符;
地址运算符;
sizeof长度运算符。
3级优先级(左结合)
*乘法运算符;
/除法运算符;
%取余运算符。
4级优先级(左结合)
+加法运算符;
-减法运算符。
5级优先级(左结合)
<
左移运算符;
右移运算符。
6级优先级(左结合)
、<
=、>
、>
=关系运算符。
7级优先级(左结合)
==等于运算符;
=不等于运算符。
8级优先级(左结合)
&
按位与运算符。
9级优先级(左结合)
^按位异或运算符。
10级优先级(左结合)
|按位或运算符。
11级优先级(左结合)
逻辑与运算符。
12级优先级(左结合)
||逻辑或运算符。
13级优先级(右结合)
?
条件运算符。
14级优先级(右结合)
=、+=、-=、*=、/=、%=、&
=、^=、|=、<
=、>
=赋值运算符。
15级优先级(左结合)
,逗号运算符。
运算符优先级
优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。
所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。
其它的都是从左至右结合。
具有最高优先级的其实并不算是真正的运算符,它们算是一类特殊的操作。
()是与函数相关,[]与数组相关,而->
及.是取结构成员。
其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的真正的运算符中它们具有最高的优先级,又由于它们都是从右至左结合的,因此*p++与*(p++)等效是毫无疑问的。
另外在C语言里没有前置后置之分因为++--是右结合所以右侧优先运算表现为"
操作数后置优先级比较高"
的假象前置和后置的区分是因为运算符重载而后加入C++的
接下来是算术运算符,*、/、%的优先级当然比+、-高了。
移位运算符紧随其后。
其次的关系运算符中,<
=要比==!
=高一个级别,不大好理解。
所有的逻辑操作符都具有不同的优先级(单目运算符出外,!
和~)
逻辑位操作符的"
与"
比"
或"
高,而"
异或"
则在它们之间。
跟在其后的&
比||高。
接下来的是条件运算符,赋值运算符及逗号运算符。
在C语言中,只有4个运算符规定了运算方向,它们是&
、||、条件运算符及赋值运算符。
、||都是先计算左边表达式的值,当左边表达式的值能确定整个表达式的值时,就不再计算右边表达式的值。
如a=0&
b;
&
运算符的左边位0,则右边表达式b就不再判断。
在条件运算符中。
如a?
b:
c;
先判断a的值,再根据a的值对b或c之中的一个进行求值。
赋值表达式则规定先对右边的表达式求值,因此使a=b=c=6;
成为可能。
运算符优先级等级口诀及注释
运算符优先级等级口诀
圆方括号、箭头一句号,自增自减非反负、针强地址长度,
乘除,加减,再移位,
小等大等、等等不等,
八位与,七位异,六位或,五与,四或,三疑,二赋,一真逗。
其中“,”号为一个等级分段。
运算符优先级等级注释
“圆方括号、箭头一句号”指的是第15级的运算符。
其中圆方括号很明显“()、[]”,箭头指的是指向结构体成员运算符“->
”,句号指的是结构体成员运算符“.”;
“自增自减非反负、针强地址长度”指的是第14级的运算符。
其中非指的是逻辑运算符“!
”,反指的是按位取反运算符“~”,负指的是负号运算符“-”,针指的是指针运算符“*”,强指的是强制类型转换运算符,地址指的是地址运算符“&
”,长度指的是长度运算符“sizeof”;
“乘除,加减,再移位”移位指的是左移运算符“<
”和右移运算符“>
”,其中除法还包括了取余运算符“%”;
“小等大等、等等不等”指的是第10级到第9级的运算符:
和>
=,等等指的是等于运算符==,不等指的是不等于运算符!
=
“八位与,七位异,六位或”其中八位与指的是第8级的按位与运算符“&
”,七位异指的是第7级的按位异或运算符“^”,六位或指的是第6级的按位或运算符“||”;
“五与,四或”指的是第5级、第4级的逻辑与运算符“&
”和逻辑或运算符“||”;
“三疑,二赋,一真逗”指的是第3级到第1级的运算符。
其中,三疑指的是条件运算符“?
”(三有双重含义:
即指优先级别是三,它的运算符类型也是三目,疑也取“?
”之意),二赋指的是赋值运算符=、+=、-=、*=、/=、%=、>
=、<
=、&
=、^=和|=,一真逗指的是第1级的“,”运算符,真字只是为了语句需要罢了。
由于C语言的运算符优先级与C++的不完全一样(主要是增加了几个运算符),所以这个口诀不能完全实用于C++.但是应该能够兼容,大家可以比较一下他们的区别应该就能够很快掌握C++的优先级的!
运算符应用举例
·
赋值运算符:
a=5;
a=b=0;
第一个赋值语句把5赋给变量a;
第二个赋值语句的意思是把0同时赋值给两个变量。
这是因为赋值语句是从右向左运算的,也就是说从右端开始计算,先b=0,然后a=b。
复合赋值运算符:
a=1;
a+=3;
上面第二个赋值语句等价于a=a+3;
即a=4。
算术运算符:
Area=Height*Width;
num=num1+num2/num3-num4;
第一个赋值语句Height和Width相乘结果赋给变量Area;
第二个赋值语句先完成num2与num3的整除运算,然后与num1相加,再减去num4,结果赋给num。
运算符运算顺序先算乘除再算加减。
单目正和单目负最先运算。
逻辑运算符:
a=1,b=1;
a||b-1;
因为a=1为真值,所以不管b-1是不是真值,总的表达式一定为真值,这时后面的表达式就不会再计算了。
关系运算符:
if(a>
0)...
如果a>
0,则执行if语句中的内容,否则退出。
条件运算符:
a=(b>
0)?
-b;
当b>
0时,a=b;
当b不大于0时,a=-b;
其实上面的意思就是把b的绝对值赋值给a。
逗号运算符:
b=2,c=7,d=5;
a=(++b,c--,d+3);
有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是d+3=8,所以a=8。