运算符是一种编译器执行特定的数学或逻辑操作的符号。C语言提供了以下类型的运算符:
算术运算符分为单目运算符和双目运算符,单目运算符表示只需要一个操作数,双目运算符需要两个操作数。
双目运算符中,C语言中的加号、减号与数学中的一样。乘号、除号因为ASCII符号中没有与数学中相对应的符号,所以使用星号表示乘号,使用斜线表示除号。C语言中增加了一个求模运算符,是用来取余的。需要注意的是,求模运算符的两个操作数必须是整型。
【实例6.1】加减乘除以及取模运算
执行以上程序,输出结果为:
加、减与数学中的一样,其中需要说明的是除法以及取模运算。C语言中的除法运算,不同类型的除数和被除数会导致不同类型的运算结果。一种情况是,当除数和被除数都是整数时,运算结果也是整数。当不能整除时,就直接舍弃小数部分,只保留整数部分。另一种情况是,一旦除数和被除数中有一个是小数,那么运算结果也是小数,并且是double类型的小数。C语言中的取余运算,就是求相除后的余数。取余运算中%的两边都必须是整数,不能出现小数,否则会报错。余数可以是正数也可以是负数,由%左边的整数决定:如果%左边是正数,那么余数也是正数;如果%左边是负数,那么余数也是负数。
单目运算符中,只需要一个操作数。取负操作符将正操作数设置为负数,负操作数设置为正数。自增运算符使得变量的值增加1,自减运算符使得变量的值减少1。比如:
变量i的值增加1,变量j的值减少1,相当于:
自增运算符和自减运算符的运算对象只能是变量,不能是常量或者表达式,否则将会报错。比如:
自增运算符和自减运算符分为两种方式:一种是在变量前面,称为前缀模式;一种是在变量后面,称为后缀模式。下面介绍一下两种方式的区别:
前缀模式,也被理解为先运算后赋值,比如:
执行上面语句,i和j的值都是2。先是变量i自增,i的值变为2,再将结果2赋值给j。
后缀模式,也被理解为先赋值后运算,比如:
执行上面语句,i的值是2,j的值是1。先是变量i赋值给j,这个时候i还没有自增操作,i的值还是1,所以j的值是1。赋值后,i再自增,i的值变为2。
【实例6.2】前缀模式和后缀模式
执行以上程序,输出结果为:
++ 在变量前面和后面是有区别的:++ 在前面叫做前自增。前自增先进行自增运算,再进行其他操作。++ 在后面叫做后自增。后自增先进行其他操作,再进行自增运算。
对于,c = a++; a 的值不会立马加 1,而是先把 a 原来的值(也就是10)交给 c,然后再加 1。a 原来的值为 10,所以 c 的值也就为 10。而 a 经过自增,最终值为 11。
对于,c = a--; a 的值不会立马减 1,而是先把 a 原来的值(也就是10)交给 c,然后再减 1。a 原来的值为 10,所以 c 的值也就为 10。而 a 经过自减,最终值为 9。
对于,c = ++a,先执行 ++a,结果为 11,再将 11 赋值给 c,所以 c 的最终值为11。而 a 经过自增,最终的值也为 11。
对于,c = --a,先执行 --a,结果为 9,再将 9 赋值给 c,所以 c 的最终值为9。而 a 经过自减,最终的值也为 9。
在数学运算中,运算符是有优先级的,C语言中的运算符也有优先级。算术运算符的优先级:单目算术运算符(-、++、--) > 乘号(*)、除号(/)、求模(%) > 加号(+)、减号(-)。比如:
根据优先级,将会先计算2 * 3,再将得到的结果6和1相加,得到7,赋值给变量a。
当表达式中有多个相同优先级的运算符时,按照从左到右的顺序运算。比如:
乘号(*)、除号(/)优先级相同,按照从左到右的顺序运算,先计算2 * 3,将结果6 / 3,得到结果2和1相加,得到3,赋值给变量a。
如果需要改变表达式的运算顺序,我们还可以使用圆括号。比如:
先计算圆括号内的1 + 2,得到的结果3再去运算,最后得到3,赋值给变量a。
关系运算符只有两种结果:true或者false。true代表条件为真,false代表条件为假。C语言中,一般非0值代表true,0代表false。比如:
逻辑运算符与数学上有相同之处。逻辑运算符和关系运算符一样,也只有两种结果:true或者false。逻辑运算符可以将多个关系表达式的结果合并起来。我们要判断变量i是否在0和100之间,不能直接表示成:0 =< i =< 100。需要使用逻辑运算符来表示,比如:
如果变量i在0和100之间,则结果为true,否则为false。
逻辑运算符也是有优先级的,逻辑非运算符(!)>逻辑与运算符(&&)>逻辑或运算符(||)。
【实例6.3】逻辑运算符
执行以上程序,输出结果为:
在使用printf()函数以整数形式输出逻辑结果时,1代表true,0代表false。!a代表a取反,0取反结果为true,所以输出1。那么!b取反则输出0。a&&b代表a和b做与运算,0和1做与运算,结果为false,则输出0。a||b 代表a和b做或运算,0和1做或运算,结果为true,则输出1。a&&b ||
位运算符作用于位,并逐位执行操作,也就是二进制的运算。
位运算符不能用于float、double等类型,只能用于整数类型。
【实例6.4】位运算符
执行以上程序,输出结果为:
A = 50,B = 19,现在以二进制格式表示,它们如下所示:
然后按照二进制位进行相应运算得到结果值。二进制左移运算符,运算对象的各二进制位全部左移若干位,左边的二进制位丢弃,右边补0;二进制右移运算符,运算对象的的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
C语言中,可以将赋值运算符分为两类:简单赋值运算符和复合赋值运算符。
简单赋值运算符就是"=",一般语法格式:
赋值运算符"="和数学表达式中的等号"="的意义是不同的。前面我们就多次用到了赋值运算符"="。"="的作用是把结果赋值给变量,所以赋值运算符的左边必须是变量,赋值运算符从右向左的顺序计算。比如:
以上语句,先将1赋值给b,再将变量b赋值给变量a。
赋值也是一种运算,我们可以放在表达式中。比如:
以上语句,先将1赋值给b和将2赋值给c,再将变量b和c的值相加,最后得到的结果3赋值给a。
赋值运算的规则是将左侧的变量和右侧的操作数进行运算,然后再将得到的结果赋值给左侧的变量。比如:
条件运算的一般语法格式如下:
从语法格式中,我们可以看出,这是一个三目运算。通过问号和冒号将三个表达式连接起来。整个表达式的运算过程:先计算表达式1的值,如果它的值为true(非0值),则将表达式2的值返回;如果它的值为false(0值),则将表达式3的值返回。
【实例6.5】条件运算符,比较两个数的最大值
执行以上程序,输出结果为:
先计算a > b,值为false,将b的值返回,结果为10。
这里介绍一下sizeof长度运算符,其余的在后面会讲到。sizeof运算符返回一个数据类型、变量、常量所占的字节长度,可以使用printf()函数来输出。
执行以上程序,输出结果为:
int类型字节长度:4 常量100字节长度:4
可以看到结果都是4,这是因为int类型的字节长度是4,变量a的字节长度也就是4,存储的常量100自然也就是4。
总结一下,本节内容主要介绍了C语言的算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符和其他运算符。
结合方向 左结合(自左至右)
-> 指向结构体成员运算符
. 结构体成员运算符 [1] (请注意它是一个实心圆点)
结合方向 右结合(自右至左)单目运算符
(类型) 类型转换运算符
结合方向 左结合 双目运算符
结合方向 左结合 双目运算符
结合方向 左结合 双目运算符
结合方向 左结合 双目运算符
结合方向 左结合 双目运算符
== 等于运算符 (判断)
!= 不等于运算符(判断)
结合方向 左结合 双目运算符
结合方向 左结合 双目运算符
结合方向 左结合 双目运算符
| 按位或运算符 举例:0xfe|0xef 即为 与按位或运算则答案为: 即0xff。
结合方向 左结合 双目运算符
结合方向 左结合 双目运算符
结合方向 右结合 三目运算符
结合方向 右结合 双目运算符
* = 乘后赋值运算符
/ = 除后赋值运算符
% = 取模后赋值运算符
&= 按位与后赋值运算符
^=按位异或后赋值运算符
|= 按位或后赋值运算符
1.1 C语言基础知识
1.【2011年9月选择题第11题】以下叙述中错误的是________。
A)C语言编写的函数源程序,其文件名后缀可以是.C
B)C语言编写的函数都可以作为一个独立的源程序文件
C)C语言编写的每个函数都可以进行独立的编译并执行
D)一个C语言程序只能有一个主函数
【解析】C语言编写的每个函数可以被独立编译,但是除主函数外不能独立执行。
2.【2011年3月选择题第11题】计算机高级语言程序的运行方法有编译执行和解释执行两种,以下叙述中正确的是
A)C语言程序仅可以编译执行
B)C语言程序仅可以解释执行
C)C语言程序既可以编译执行又可以解释执行
【解析】解释程序是将源程序(如BASIC)作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。编译程序是把高级语言(如FORTRAN、COBOL、Pascal、C等)源程序作为输入,进行翻译转换,产生出机器语言的目标程序,然后再让计算机执行这个目标程序,得到计算结果。
3.【2011年3月选择题第12题】以下叙述中错误的是
A)C语言的可执行程序是由一系列机器指令构成的
B)用C语言编写的源程序不能直接在计算机上运行
C)通过编译得到的二进制目标程序需要连接才可以运行
D)在没有安装C语言集成开发环境的机器上不能运行C源程序生成的.exe文件
【解析】C语言的可执行程序是由一系列机器指令组成的,用C语言编写的源程序必须经过编译生成二进制目标代码,再经过连接才能运行,并且可以脱离C语言集成开发环境。故答案为D)。
1.2 常量、变量和数据类型
4.【2011年9月选择题第13题】以下选项中关于C语言常量的叙述错误的是。
A)所谓常量,是指在程序运行过程中,其值不能被改变的量
B)常量分为整型常量、实型常量、字符常量和字符串常量
C)常量可分为数值型常量和非数值型常量
D)经常被使用的变量可以定义成常量
【解析】常量是其值不可变化的量。常量分为数字常量和字符常量。在C语言中,常量多是通过符号常量来表示的。数字常量又包括整形常量和浮点型常量,浮点型常量又称实数。在程序中不希望被改变的变量才定义为常量,而不是经常使用的变量。