c语言的运算符:C语言运算符



C语言内部运算符很丰富运算符是告诉编译执行特定算术或逻辑操作符号C语言有 3大运算符:算术、关系和逻辑、位操作另外C还有些特殊运算符用于完成些特殊任务
2.6.1算术运算符
表2-5列出了C语言中允许算术运算符在C语言中运算符“”、“-”、“*”和“/”使用方法和大多数计算机语言相同几乎可用于所有C语言内定义数据类型当“/”被用于整数或结果取整例如在整数除法中10/3=3
元减法实际效果等于用-1乘单个操作数即任何数值前放置减号将改变其符号模运算符“%”在C语言中也同它在其它语言中使用方法相同切记模运算取整数除法余数所以“%”不能用于float和double类型

最后行打印个0和个11/2整除时为0余数为1故1%2取余数1
2.6.2自增和自减
C语言中有两个很有用运算符通常在其它计算机语言中是找不到它们—自增和自减运算符和--运算符“”是操作数加1而“--”是操作数减1换句话说:x=x1;同x;x=x-1;同--x;
自增和自减运算符可用在操作数的前也可放在其后例如:x=x1;可写成x;或x;但在表达式中这两种使用方法是有区别自增或自减运算符在操作数的前C语言在引用操作数的前就先执行加1或减1操作;运算符在操作数的后C语言就先引用操作数而后再进行加1或减1操作请看下例:
x=10;
;y=x;
此时y=11如果改为:
x=10;y=x;
则y=10在这两种情况下x都被置为11但区别在于设置时刻这种对自增和自减发生时刻控制是非常有用在大多数C编译为自增和自减操作生成代码比等价赋值语句生成代码
要快得多所以尽可能采用加1或减1运算符是种好选择
下面是算术运算符优先级:
:最高、-
--
-(元减)
*、/、%最低、-编译对同级运算符按从左到右顺序进行计算当然括号可改变计算顺序C语言
处理括号思路方法和几乎所有计算机语言相同:强迫某个运算或某组运算优先级升高
2.6.3关系和逻辑运算符
关系运算符中“关系” 2字指个值和另个值的间关系逻辑运算符中“逻辑” 2字指是连接关系方式关系和逻辑运算符常在起使用所以将它们放在起讨论关系和逻辑运算符概念中关键是True(真)和Flase(假)C语言中非0为True0为Flase使用关系或逻辑运算符表达式对Flase和Ture分别返回值0或1(见表2-6)

表2-6给出于关系和逻辑运算符下面用1和0给出逻辑真值表关系和逻辑运算符优先级比算术运算符低即像表达式10>112计算可以假定是对表达式10>(112)计算当然该表达式结果为Flase个表达式中允许运算组合例如:
10>5&&!(10<9)||3<=4
表达式结果为True
下表给出了关系和逻辑运算符相对优先级:
:最高!

>=<=
=!=
=&&
最低||同算术表达式在关系或逻辑表达式中也使用括号来修改原计算顺序切记所有关系和逻辑表达式产生结果不是0就是1所以下面段不仅正确而且
将在屏幕上打印数值1
x;
;x=100;
;prf("%d",x>10);
2.6.4位操作符
和其它语言区别C语言支持全部位操作符(BitwiseOperators)C语言设计目是取代汇编语言所以它必须支持汇编语言所具有运算能力位操作是对字节或字中位(bit)进行测试、置位或移位处理这里字节或字是针对C标准中char和数据类型而言位操作不能用于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
第 2次取反码00101100
注意对同行进行连续两次求反总是得到原来数字所以第次求反表示了字
编码第 2次求反进行译码又得到了原来可以用下面encode进行编码

2.6.5?操作符
C语言提供了个可以代替某些-then-语句简便易用操作符?该操作符是 3元般形式为:
EXP1?EXE2:EXP3
3
EXP1EXP2和EXP3是表达式注意冒号使用方法和位置
操作符“?”作用是这样在计算EXP1的后如果数值为True则计算EXP2并将结果作为整个表达式数值;如果EXP1值为Flase则计算EXP3并以它结果作为整个表达式请看下例:
x=10;
;y=x>9?100:200;
例中赋给y数值是100如果x被赋给比9小y值将为200若用-语句改写有下面等价:
x=10;(x>9)y=100;
;y=200;
;
有关C语言中其它条件语句将在第3章进行讨论
2.6.6逗号操作符
作为个操作符逗号把几个表达式串在逗号操作符左侧总是作为void(无值)这意味着其右边表达式值变为以逗号分开整个表达式例如:
x=(y=3,y1);
这行将3赋给y然后将4赋给x逗号操作符优先级比赋值操作符优先级低所以必须使用括号实际上逗号表示操作顺序当它在赋值语句右边使用时所赋值是逗号分隔开表中最后那个表达式例如
y=10;x=(y=y-5,25/y);
执行后x值是5y起始值是10减去5的后结果再除以25得到最终结果
在某种意义上可以认为逗号操作符和标准英语and是同义词
2.6.7有关优先级小结
表2-10列出了C语言所有操作符优先级其中包括将在本书后面讨论某些操作符注意所有操作符(除元操作符和?的外)都是左结合元操作符(*&和-)及操作符“?”则为右结合
Tags:  c语言中的运算符 c语言位运算符 c语言运算符优先级 c语言的运算符

延伸阅读

最新评论

发表评论