C语言运算符大全
-
C
语言运算符大全
C
语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。
p>
C
语
言有三大运算符:算术、关系与逻辑、
位操作。另外,
C
还有一些特殊的运算符,用于完成
一些特殊的任务。
2.6.1
算术运算符
表
2-5
列出了
C
语言中允许的算术运算符。在
C
语言中,运算符
“
+
”
、
“-
”
、
“
*
”和
“
/
”
的用法与大多数计算机语言的相
同,几乎可用于所有
C
语言内定义的数据类型。当“
/
”被
用于整数或字符时,结果取整。例如,在整
数除法中,
10/3=3
。
一元减法的实际效果等于用
-1
乘单个操作数,
即任何数值前放置减号将改变其符号。模运
算符“
%
”在
C
语言中也同它在其它语言中的用法相同。切
记,模运算取整数除法的余数,
所以“
%
”不能用于
float
和
doubl
e
类型。
最后一行打印一个
0
和一个
1
p>
,因为
1/2
整除时为
0
,余数为
1
,故
1%2
取余数
1
。
2.6.2
自增和自减
C
语言中有两个很有用的运算符,
通常
在其它计算机语言中是找不到它们的—自增和自减运
算符,
++
和
--
。运算符“
++
”是操作数加
1
,而“
--
”是操作数减
1
,换句话说:
x=x+1;
同
++x;
x=x-1;
同
--x;
自增和自减
运算符可用在操作数之前,也可放在其后,例如:
x=x+1
;
可写成
++x
;或
x++
;
但在表达式中这两种用法是有区别的。
自增或自减
运算符在操作数之前,
C
语言在引用操作
数之前就先执行加
1
或减
1
操作;运算符在操作数之后,
C
语言就先引用操
作数的值,而后
再进行加
1
或减
1
操作。请看下例:
x=10;
;y=++x;
此时,
y=11
。如果程序改为:
x=10;y=x++;
则
y=10
。在这两种情况下,
x
都被置为
11
,但区别在于设置的时刻,这种对自增和自减发
< br>生时刻的控制是非常有用的。在大多数
C
编译程序中,为
自增和自减操作生成的程序代码
比等价的赋值语句生成的代码
要快得多,所以尽可能采用加
1
或减<
/p>
1
运算符是一种好的选择。
。下面是算术运算符的优先级:
:最
高
++
、
-
--
-
(一元减)
*
、
/
、
%
最低
+
、
-<
/p>
编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计
< br>算顺序。
C
语言
处理括号的方法与几乎所有的计算机语言相同:强迫某个运算或某组运算的优先级升高。
2.6.3
关系和逻辑运算符
关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻
辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在
一起讨论。关系和逻辑运算符概念中的关键是
True
(真)和
Flase
(假)
。
C
语言中,非
0
为
True
,
0
为
Flase
。
使用关系或逻辑运
算符的表达式对
Flase
和
Ture
分别返回值
0
或
1(
见
表
2-6)
< br>。
表
< br>2-6
给出于关系和逻辑运算符,下面用
1
和
0
给出逻辑真值表。关系和逻辑运算符的优
先级比算术运算符低,即像表达式
10>1+12
的计算可以假定是对表达式
10>(1+12)
的计算,<
/p>
当然,该表达式的结果为
Flase
。在
一个表达式中允许运算的组合。例如:
10>5&&!(10<9)||3<=4
这一表达式的结果
为
True
。
。下表给出了关系和逻辑运算符的相对优先级:
:最高!
!
>= <=
=== !=
=&&
最低
||
同算术表达式一样,在关系或
逻辑表达式中也使用括号来修改原计算顺序。切记,
所有关系和逻辑表达式产生的结果不
是
0
就是
1
,
所以下面的程序段不仅正确而且
将在屏幕上打印数值
1
。
int x;
;x=100;
;printf(
2
.6.4
位操作符
与其它语言不同,
C
语言支持全部的位操作符(
Bitw
iseOperators
)
。因为
C
语言的设计目
的是取代汇编语言,所以它必须支持汇编语言所具
有的运算能力。位操作是对字节或字中
的位(
bit
)进行测试、置位或移位处理,这里字节或字是针对
C
标准中的
char
和
int
数
据类型而言的。位操作不能用于
float
、
double
、
longdouble
、
void
或其它复杂类型。表
2-7
给出了位操作的操作符。位操作中的
AND
、
OR
和
NOT
(
1
的补码)的真值表与逻辑运算
等价,唯一不同的是位操作是逐位进行运算的。
如表
2-8
所示,当且仅当一个操作数为
True
时,异
或的输出为
True
,否则为
Flas
e
。
位操作通常用于设备驱动程序,
例如调制解调器程序、磁盘文件管理程序和打印机驱动程
序。这是因为位操作可屏蔽掉某
些位,如奇偶校验位(奇偶校验位用于确保字节中的其它
位不会发生错误通常奇偶校验位
是字节的最高位)
。
通常我们可把位操作
AND
作为关闭位的手段,这就
是说两个操作数中任一为
0
的位,其结
果中对应位置为
0
。例如,下面的函数通过调用函数
read_modem()
,从调制解调器端口读
入一个字符,并将奇偶校验位置成
0
。
字节的位
8
是奇偶位,将该字节与一个位
1
到位
7
为
1
、位
8
为
0
的字节进行与操作,可将
该字节的奇偶校验位置成
0
。
< br>表达式
ch&127
正是将
ch
中每一位同
127
数字的对应位进行与
操作,结果
ch
的位
< br>8
被置成了
0
。在下面的例子中
,假定
ch
接收到字符
并且奇偶位已
经被置位。
一般来说,位的
AND
、
OR
和
XOR
操作通过对操
作数运算,直接对结果变量的每一位分别处
理。正是因为这一原因(还有其它一些原因)
,位操作通常不像关系和逻辑运算符那样用在
条件语句中,我们
可以用例子说明这一点:假定
X=7
,那么
x&&8
为
Ture(1),
而<
/p>
x&8
却为
Flase(0)
。
记住,关系和逻辑操作符结果不是
0
就是
1
。而相似的位操
作通过相应处理,结果可为任意
值。换言之,位操作可以有
0<
/p>
或
1
以外的其它值,而逻辑运算符的计算
结果总是
0
或
1
。
移位操作符
>>
和
<<
将变量的各位按要求向或向左移动。右移语句通
常形式是:
variable>>
右移位数
左移语句是:
variable<<
左移位数
p>
当某位从一端移出时,另一端移入
0
(某些
计算机是送
1
,详细内容请查阅相应
C
编译程序
用户手册)
。切记:移位不同
于循环,从一端移出的位并不送回到另一端去,移去的位永远
丢失了,同时在另一端补<
/p>
0
。
移位操作
可对外部设备(如
D/A
转换器)的输入和状态信息进行译码,
移位操作还可用于
整数的快速乘除运算。如表
2-9
所示(假定移位时补
0
)
,左移一位等效于乘
2
,而右移一
位等
效于除以
2
。
每左移一位乘
2
< br>,注意
x<<2
后,原
x
的信息已经丢失了,因为一位已经从一端出,每右移
一位相当于被
p>
2
除,注意,乘后再除时,除操作并不带回乘法时已经丢掉的高位。
反码操
作符为
~
。
~
的作用是将特定变量的各位状态取反,即将所有的
1
p>
位置成
0
,所有的
0
位置成
1
。位操作符经常用在加密程
序中,例如,若想生成一个不可读磁盘文件时,可以在文件上
做一些位操作。最简单的方
法是用下述方法,通过
1
的反码运算,将每个字节的每一位取<
/p>
反。
原字节
00101100
第一次取反码
11010011
第二次取反码
00101100
注
意,对同一行进行连续的两次求反,总是得到原来的数字,所以第一次求反表示了字
<
/p>
节的编码,第二次求反进行译码又得到了原来的值。可以用下面的函数
encode()
对字符进
行编码。
2.6.5
?
操作符
C
语言提供了一个可以代替某些
if-
then-else
语句的简便易用的操作符?。该操作符是三
元的,其一般形式为:
EXP1?EXE2:EXP3
3
EXP1
,
EXP2
和
EXP3
是表达式,注意
冒号的用法和位置。
操作符“
?
p>
”作用是这样的,在计算
EXP1
之后,如
果数值为
True
,则计算
EXP2<
/p>
,并将结果
作为整个表达式的数值;如果
EXP1
的值为
Flase
,则计算<
/p>
EXP3
,并以它的结果作为整个表
达式
的值,请看下例:
x=10;
;y=x>9?100:200;
例中,赋给
y
的数值是
100
,如果
p>
x
被赋给比
9
小的
值,
y
的值将为
200
,若用
if-else
语
句改
写,有下面的等价程序:
x=10;if(x>9)y=100;
;elsey=200;
;
有关<
/p>
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
是同义词。
p>
2.6.7
关于优先级的小结
表
2-10
列出了
C
语言所有操作符的优先级,其中包括将在本书后面讨论的某些操作符。注
意,所有操作符(除一元操作符和?之外)都是左结合的。一元操作符(
*
p>
,
&
和
-
)及操作
符“?”则为右结合。
?
C
语言运算符大全
< br>C
语言共有
34
个运算符,今天
闲来没事就找了一下,现在拿出来分享一下呵:
按优先级排序
,空行表示优先级下降,
01
为最高,最先算
< br>
14~31
均为双目,左结合
()
01
.圆括号
[]
02
.下标
->
03
.指针型结构成员
.
04
.结构成员
! 05
.逻辑非
~ 06
.位非
++ 07
.自增
-- 08
.自减
- 09
.取负
(
类型
)
10
.类型转换
*
11
.取内容
&
12
.取地址
sizeof
13
.求字节
此级(
5~13
)均为单目运算,且都为右结合
* 14
.乘
/ 15
.除
% 16
.求余
+ 17
.加
- 18
.减
<< 19
.左移
>> 20
.右移
< 21
.小于