3014C语言_运算符
第四章 运算符
- 4.1 分类
- C语言的运算符范围很广,可分为以下几类:
- 1、算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(%)、自增(++)、自减(--)共七种。
- 2、赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
- 3、逗号运算符:用于把若干表达式组合成一个表达式(,)。
- 4、关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
- 5、逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
- 6、条件运算符:这是一个三目运算符,用于条件求值(?:)。
- 真前假后
- 7、位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
- 8、指针运算符:用于取内容(*)和取地址(&)二种运算。
- 9.、求字节数运算符:用于计算数据类型所占的字节数(sizeof)。
- 10、特殊运算符:有括号(),下标[],成员(→,.)等几种。
- 另外,按参与运算的对象个数,C语言运算符可分为:单目运算符 (如 !)、双目运算符 (如+,- )和三目运算符 (如 ? : )。
- 级别由大到小:(逻辑)非 >算(术运算符) >关(系运算符) >(逻辑)与 >(逻辑)或 >条(件运算符) >赋(值运算符)
- C语言的运算符范围很广,可分为以下几类:
- 4.2算术运算符和算术表达式
- 4.2.1 基本的算术运算符与表达式
- 算术运算符
- (1)+(加法运算符或正值运算符,如2+5)。
- (2)-(减法运算符或负值运算符,如4-2)。
- (3)*(乘法运算符,如3*8)。
- (4)/(除法运算符,如11/5)。
- /的运算分为两种情况:
- a、“除”的左右两边都为整数时,所得结果必然是整数(注意:仅取整数部分,不是四舍五入)
- 比如:5/2的值为2,不是2.5,1/2的值为0。
- b、“除”的左右两边至少有一个是实型数据(即小数)时,所得结果为实型数据。
- 比如:5/2.0的值为2.5,7.0/2.0的值为3.5.
- a、“除”的左右两边都为整数时,所得结果必然是整数(注意:仅取整数部分,不是四舍五入)
- /的运算分为两种情况:
- (5)%(模运算符或称求余运算符,%两侧均应为整型数据,如9%7的值为2)。
- 需要说明的是:当运算对象为负数时,所得结果随编译器不同而不同,在vc中,结果的符号与被除数相同,比如:13%-2值为1,而-15%2值为-1.
- %符号两边要求是整数。不是整数就错了
- 表达式:
- 是表达式就一定有数值。算术表达式是用算术运算符和括号将运算量(也称操作数)连接起来的、符合C语言语法规则的表达式。运算对象包括函数、常量和变量等。
- 赋值表达式:
- 表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。
- 自加、自减表达式:
- 假设a=5,++a(是为6), a++(为5);运行的机理:++a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后再用这个++a表达式的数值为6,而a++是先用该表达式的数值为5,然后再把a的数值加上1为6,再放到变量a中。 进行了++a和a++后 在下面的程序中再用到a的话都是变量a中的6了。
- 考试口诀:++在前先加后用,++在后先用后加。
- 逗号表达式:
- 优先级别最低 ;表达式的数值逗号最右边的那个表达式的数值。(2,3,4)的表达式的数值就是4。
- 算术表达式和运算符的优先级与结合性
- 在计算机语言中,算术表达式的求值规律与数学中的四则运算的规律类似,其运算规则和要求如下。
- (1)在算术表达式中,可使用多层圆括号,但括号必须配对。运算时从内层圆括号开始,由内向外依次计算各表达式的值。
- (2)在算术表达式中,对于不同优先级的运算符,可按运算符的优先级由高到低进行运算,若表达式中运算符的优先级相同,则按运算符的结合方向进行运算。
- (3)如果一个运算符两侧的操作数类型不同,则先利用自动转换或强制类型转换,使两者具有相同类型,然后进行运算。
- 在计算机语言中,算术表达式的求值规律与数学中的四则运算的规律类似,其运算规则和要求如下。
- 自增自减运算符
- 作用:使变量的值增1或减1。
- 如:
- ++i,--i (在使用i之前,先使i的值加1、减1)。
- i++,i-- (在使用i之后,使i的值加1、减1)。
- 如:
- (1)只有变量才能用自增运算符 (++)和自减运算符(--),而常量或表达式不能用,如10++或(x+y)++都是不合法的。
- (2)++和--的结合方向是“自右向左“,如 -i++ ,i的左边是负号运算符,右边是自增运算符,负号运算和自增运算都是 “自右向左“结合的,相当于-(i++)。
- (3)在循环语句中常用到自增(减)运算符,在指针中也常用到该运算符,区别“i++”和“++i”及“i--”和“--i”,表达式的值和变量的值。
- 例:变量n的初始值为2,则
- 表达式类型 i++ ++i i-- --i
- n值为2时各表达式的值 2 3 2 1
- 经过各表达式运算后变量n的值变化为 3 3 1 1
- 例:变量n的初始值为2,则
- (4)l 当++或—与printf语句结合时,若++/--x的形式,则先自增/自减,然后输出;若x++/--的形式,则先输出x原值,在进行自增/自减操作。
- 有以下程序
- #include
- main()
- { int x=011;
- printf("%d\n",++x); //10
- }
- 【解析】011是一个八进制的数,转为十进制则为1*8+1=9;++x是x先自增1再参与其他运算,所以先x自增1为10再输出即为10,故选C。
- 有以下程序
- 作用:使变量的值增1或减1。
- 算术运算符
- 4.2.1 基本的算术运算符与表达式
- 4.3 赋值运算符与赋值表达式
- 4.3.1赋值运算符与赋值表达式
- 赋值符号
- =
- 作用
- 将一个数据赋给一个变量或将一个变量的值赋给另一个变量,由赋值运算符组成的表达式称为赋值表达式。
- 一般形式为:
- 变量名 = 表达式
- 注意
- 赋值运算符左边必须是变量,而不是表达式。
- 在程序中可以多次给一个变量赋值,每赋一次值,与它相应的存储单元中的数据就被更新一次,内存中当前的数据就是最后一次所赋值的那个数据。
- 例:a=12; 此表达式读作“将10的值赋值给变量a”。
- 如果赋值号两边的运算对象类型不一致,系统会自动进行类型转换,转换的规则:将赋值号右边表达式的值的类型转换成赋值号左边变量的类型,
- 例:int y=3.5; 在变量y中最终存储的是整数3。
- 可以将赋值表达式的值再赋值给变量,形成连续赋值。
- 例如:x=y=25是一个连续赋值表达式,x=y=25 等价于x=(y=25),所以表达式x=y=25 最终的值为25 。
- 赋值符号
- 4.3.2复合的赋值运算符
- 在赋值运算符之前加上其他运算符可以构成复合赋值运算符。其中与算术运算有关的复合运算符是:+=,-=,*=,/=,%= 。
- 两个符号之间不可以有空格,复合赋值运算符的优先级与赋值运算符的相同。表达式n+=1等价于n=n+1,作用是取变量n中的值增1再赋给变量n,其他复合的赋值运算符的运算规则依次类推。
- 如求表达a+=a-=a*a的值,其中a的初值为12 。
- 步骤:
- (1)先进行“a-=a*a“运算,相当于a=a-a*a=12-144=-132 。
- (2)再进行“a+=-132“运算,相当于 a=a+(-132)=-132-132=-264 。
- 4.3.1赋值运算符与赋值表达式
- 4.4 逗号运算符和逗号表达式
- 概念
- 在c语言中,逗号除了作为分隔符,还可以用作一种运算符----逗号运算符,用逗号运算符将几个表达式连接起来,例如a=b+c,a=b*c等称为逗号表达式。
- 一般形式为:
- 表达式1 ,表达式2 ,表达式3 , …,表达式n
- 例:x=2,y=3,z=4
- 表达式1 ,表达式2 ,表达式3 , …,表达式n
- 注意
- 逗号表达式具有从左至右的结合性,即先求解表达式1,然后依次求解表达式2,直到表达式n的值。表达式n的值就是整个逗号表达式的值。上述的逗号表达式的值就是表达式z=4的值4.需要注意的是,逗号运算符是所有运算符中级别最低的。
- 例:有如下程序段:
- main()
- {
- inta=2,b=4,c=6,x,y;
- y=(x=a+b),(b+c);
- printf("y=%d,x=%d",y,x);
- }
- 程序显示结果为:y=6,x=6
- 例:有如下程序段:
- 逗号表达式具有从左至右的结合性,即先求解表达式1,然后依次求解表达式2,直到表达式n的值。表达式n的值就是整个逗号表达式的值。上述的逗号表达式的值就是表达式z=4的值4.需要注意的是,逗号运算符是所有运算符中级别最低的。
- 概念
- 4.5关系运算符和关系表达式
- 4.5.1 C语言中的逻辑值
- C语言中的逻辑值只有两个:真(true)和假(flase)。用非零代表真,用零代表假。因此,对于任意一个表达式,如果它的值为零,就代表一个假值,如果它的值为非零,就代表一个真值。只要值不是零,不管是正数,负数,整数,实数,都代表一个真值。例如-5的逻辑值为真。
- 4.5.2 关系运算符
- 由两个字符组成的运算符之间不可以加空格,关系运算符都是双目运算符。
- (1)结合性:自左向右。
- (2)优先次序:前4种关系运算符( <,<=,>=,> )的优先级别相同,后两种 (==,!=)优先级相同,且前4种优先级高于后两种;关系运算符的优先级低于算术运算符,高于赋值运算符。
- 由两个字符组成的运算符之间不可以加空格,关系运算符都是双目运算符。
- 4.5.3关系表达式
- 由关系运算符连接而成的表达式称为关系表达式。
- 例如:a>b,(a=7)>(b=10)等都是合法的关系表达式。
- 关系表达式的结果有两个:0和1,。其中0表示假,1表示真。如果关系表达式成立,则值为真,如果关系表达式不成立,则值为假。
- 例:变量a的值为5,b的值为6,那么关系表达式a>b的值为假,即为0.而关系表达式
- (a=13)>(b=10)的值为真,即为1。
- 当关系运算符两边值的类型不一致时,若一边是整型,一边是实型,系统将自动把整型数转化为实型数,然后再进行比较。
- 由关系运算符连接而成的表达式称为关系表达式。
- 4.5.1 C语言中的逻辑值
- 4.6 逻辑运算符和逻辑表达式
- 4.6.1逻辑运算符及其优先级
- C语言提供了3种逻辑运算符
- 优先级 由高到低
- 逻辑运算符 !(逻辑非) 高于 &&(逻辑与)高于 ││(逻辑或)
- 说明:
- “&&”和“||”是双目运算符,要求要有两个操作数,而“!”是单目运算符,只要求有一个操作数即可。
- 以上逻辑运算符的优先级是:“!”(逻辑非)级别最高,其次是“&&”(逻辑与),“||”(逻辑或)级别最低,逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。
- 即:“!”(逻辑非)>算术运算符>关系运算符>“&&”>“||”>赋值运算符>逗号运算符。
- 4.6.2逻辑表达式
- “&&”和“||”的运算对象有两个,故它们都是双目运算符,而!的运算对象只有一个,因此它是单目运算符。
- 逻辑运算举例如下:
- (1)a&&b: 当&&两边都为“真”时,表达式a&&b的值才是真。
- 值得注意的是:在数学中,关系式0<x<10是可以使用的,表示x的值应在大于0且小于10的范围内,但在C语言中却不能用0<x<10这样一个关系表达式来表示上述的逻辑关系,即关系运算符不能连用,但可以借助逻辑运算符来辅助运算,正确的表示方法是 0<x && x<10。
- (2)a||b: 当||两边有一个为“真”时,表达式a||b的值就是真。
- (3)!a: 表示取反,如果a为真,则!A为假,反之亦然。例如!-5的值就为0.
- (1)a&&b: 当&&两边都为“真”时,表达式a&&b的值才是真。
- 4.6.3短路
- 在C语言中,由&&或||组成的逻辑表达式,在某些特定情况下会产生“短路“现象。
- (1)x && y && z ,只有当x为真(非0)时,才需要判别y的值;只有x和y都为真时,才需要去判别z的值;只要x为假就不必判别y和z,整个表达式的值为0。口诀:“一假必假”。
- 例:(!5==1)&&(++i==0) (!5==1)表达式的值为0,所以计算机运行中就跳过(++i==0)此表达式,(!5==1)&&(++i==0)表达式的值为0.
- (2)x||y||z ,只要x的值为真(非零),就不必判别y和z的值 ,整个表达式的值为1,只有x的值为假,才需要判别y的值,只有x和y的值同时为假才需要判别z的值,口诀:“一真必真”。
- (1)x && y && z ,只有当x为真(非0)时,才需要判别y的值;只有x和y都为真时,才需要去判别z的值;只要x为假就不必判别y和z,整个表达式的值为0。口诀:“一假必假”。
- 在C语言中,由&&或||组成的逻辑表达式,在某些特定情况下会产生“短路“现象。
- 4.6.1逻辑运算符及其优先级
- 4.7 位运算
- 4.7.1位运算符与位运算
- 在计算机中,数据都是以二进制数形式存放的,位运算就是指对存储单元中二进制位的运算。C语言提供6种位运算符。
- 操作符 含义 规则
- & 按位与 若两个相应的二进制位都为1,则该位的结果为1,否则为0
- | 按位或 两个相应的二进制位中只要有一个为1,则该位的结果为1,否则为0
- ^ 按位异或 若两个二进制位同号,则结果为0,异号为1
- 异或的位运算
- 0 异或 1得到1、
- 0 异或 0得到0、
- 1 异或 1得到0,
- 相同为0,不同为1
- 例 3 ∧
- 设二进制数a是00101101 ,若通过异或运算a∧b使a的高4位取反,低4位不变,则二进制数b是11110000。
- 解析:异或运算常用来使特定位翻转,只要使需翻转的位与1进行异或操作就可以了,因为原数中值为1的位与1进行异或运算得0 ,原数中值为0的位与1进行异或运算结果得1。而与0进行异或的位将保持原值。异或运算还可用来交换两个值,不用临时变量。
- 如 inta=3 , b=4;,想将a与b的值互换,可用如下语句实现:
- a=a∧b;
- b=b∧a;
- a=a∧b;
- 如 inta=3 , b=4;,想将a与b的值互换,可用如下语句实现:
- 解析:异或运算常用来使特定位翻转,只要使需翻转的位与1进行异或操作就可以了,因为原数中值为1的位与1进行异或运算得0 ,原数中值为0的位与1进行异或运算结果得1。而与0进行异或的位将保持原值。异或运算还可用来交换两个值,不用临时变量。
- 设二进制数a是00101101 ,若通过异或运算a∧b使a的高4位取反,低4位不变,则二进制数b是11110000。
- 例 3 ∧
- 异或的位运算
- ~ 按位求反 按位取反,即0变1,1变0
- << 左移 将一个数的二进制全部左移若干位
- 例1<<
- 左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
- 例如:
- a<<4
- 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
- 例如:
- 左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
- 例1<<
- >> 右移 将一个数的二进制位全部右移若干位
- 例 2>>
- 右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
- 例如:
- 设 a=15,
- a>>2
- 表示把000001111右移为00000011(十进制3)。
- 例如:
- 右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
- 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。
- 例 2>>
- 说明:
- (1)位运算中除“~“以外,均为双目运算符,要求两侧各有一个运算量。
- (2)运算量只能是整型或字符型数据,不能为实型数据。
- (3)在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以2。
- (4)特别要注意:c语言中是用非0表示逻辑真的,用0表示逻辑假的
- (5)位运算符& |~<< >> ∧ 按优先级从高到低排列的顺序是:
- 位运算符中求反运算“~“优先级最高,
- 而左移和右移相同,居于第二,
- 接下来的顺序是按位与 “&“、按位异或 “∧“和按位或 “|“。
- 顺序为~ << >> & ∧ | 。
- 在计算机中,数据都是以二进制数形式存放的,位运算就是指对存储单元中二进制位的运算。C语言提供6种位运算符。
- 4.7.1位运算符与位运算
3014C语言_运算符的更多相关文章
- C语言预处理运算符
转自C语言预处理运算符 预处理还需要运算符?有没有搞错? ^_^, 没有搞错,预处理是有运算符,而且还不止一个: #(单井号) -- 字符串化运算符. ##(双井号 )-- 连接运算符 #@ ...
- C Primer Plus_第5章_运算符、表达式和语句_编程练习
Practice 1. 输入分钟输出对应的小时和分钟. #include #define MIN_PER_H 60 int main(void) { int mins, hours, minutes; ...
- 怎样让Oracle支持中文? 语言_地域.字符集
暂时不涉及数据库业务,但是今天入库的时候中文入库报错,考虑可能是字体不支持,留待备用. 来源:Linux社区 作者:robertkun 语言_地域.字符集SIMPLIFIED CHINESE_CHI ...
- C语言位运算符:与、或、异或、取反,左移和右移
C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...
- c语言_常见图片格式判断
c语言_常见图片格式判断 我想尽各种思路.今天,终于把图片判断搞定了. 在此,我写一下我的思路.希望对那些不想看代码的朋友们有帮助. 常风的的图片格式有:bmp,png,jpg,gif等图片格式. 我 ...
- C语言位运算符:与、或、异或、取反、左移和右移
语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符 ...
- BZOJ_1212_[HNOI2004]L语言_哈希
BZOJ_1212_[HNOI2004]L语言_哈希 Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写 ...
- go语言的运算符
什么是运算符:运算符用于在程序运行时执行数学或逻辑运算 go语言的运算符如下: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 一,算数运算符 运算符 描述 实例 + 相加 A ...
- 选择排序_C语言_数组
选择排序_C语言_数组 #include <stdio.h> void select_sort(int *); int main(int argc, const char * argv[] ...
随机推荐
- Swift语言高速入门
Swift语言高速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著 ISBN 978-7-121-24328-8 201 ...
- 图像块的访问(填充 padding,步长 stride,窗 Window/kernel/filter)
无填充是有填充的特例(填充为 1). utilities(matlab)-- 图像分块(image2cols.cols2image)(未填充) 1. 一个图像块 ⇒ 返回一个值 输出矩阵的大小: ou ...
- Dual Dijkstra search for planning multiple paths
The dual Dijkstra search for planning multiple paths is performed by: (1) calculating a first shorte ...
- poj 3071 可能DP
http://poj.org/problem? id=3071 推方程不难,可是难在怎么算 dp[i][j]表示第i场时第j仅仅队伍存活下来的概率 方程:dp[i][j]=sigma(dp[i-1][ ...
- python 判断一个数为?
1. 判断一个变量是否数字(整数.浮点数)? instance('a', (int, long, float)) True isinstance('a', (int, long, float)) Fa ...
- 44个 Javascript 变态题解析——分分钟让你怀疑人生
原题来自: http://javascript-puzzlers.herokuapp.com/ 第1题 ["1", "2", "3"].ma ...
- HDU-4432-Sum of divisors ( 2012 Asia Tianjin Regional Contest )
Sum of divisors Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- ssm框架插入mysql数据库中文乱码问题解决
1. 检查web.xml <!-- 编码过滤器 --> <filter> <filter-name>encodingFilter</filter-n ...
- 简明Python3教程 9.函数
简介 函数是程序的可复用片段,允许你为语句块赋予名字之后在程序的任何地方运行它们任意次,这称做函数调用. 我们已经使用过一些内建函数,例如len和range等. 函数也许是任何有意义的软件中最重要的构 ...
- kbmmw 中XML 操作入门(跨平台,而且可以与JSON,YAML,BSON 直接互相转换)
delphi 很早以前就自带了xml 的操作,最新版里面有三种XML 解释器,一种是MSXML,看名字就知道 这个是微软自带的,这个据delphi 官方称是速度是最快的,但是只能在windows 上使 ...