C语言教程,运算符与表达式
学习目的:在编制算法时,表达
式是十分重要的。通过讲解,使
学生熟悉表达式的书写方式,能
够正确、快速理解复杂表达式。
运算符与表达式内容介绍
1、算术运算符与算术表达式、强制类型转换运
算符
2、赋值运算符与赋值表达式
3、逗号运算符与逗号表达式
4、关系运算与逻辑运算
5、长度运算符与长度运算表达式
6、位运算
运算符
运算符概述
运算符的概念
运算符是一种特殊的符号,用以表示数据的运算、赋值、比
较等,一般由 1到 2个字符组成
运算符的种类
C语言的运算符可分为以下几类,
? 算术运算符,用于各类数值运算。包括取正 (+)、取负 ( - )、
加 (+)、减 (-)、乘 (*)、除 (/)、求余 (或称模运算,%)、自增
(++)、自减 (--)共七种。
? 关系运算符,用于比较运算。包括大于 (>)、小于 (<)、等于
(==),大于等于 (>=)、小于等于 (<=)和不等于 (!=)六种。
? 逻辑运算符,用于逻辑运算。包括与 (&&)、或 (||)、非 (!)三
种。
运算符
? 位操作运算符,参与运算的量,按二进制位进行运算。包括
位与 (&)、位或 (|)、位非 (~)、位异或 (^)、左移 (<<)、右移
(>>)六种。
? 赋值运算符,用于赋值运算,分为简单赋值 (=)、复合算术
赋值 (+=,-=,*=,/=,%=)和复合位运算赋值 (&=,|=,^=,>>=,<<=)
三类共十一种。
? 条件运算符,这是一个三目运算符,用于条件求值 (?:)。
? 逗号运算符,用于把若干表达式组合成一个表达式 (,)。
? 指针运算符,用于取内容 (*)和取地址 (&)二种运算。
? 求字节数运算符,用于计算数据类型所占的字节数 (sizeof)。
? 特殊运算符,有括号 (),下标 [],成员 (→,,)等几种。
运算符
运算符的优先级和结合性
? 运算符的优先级 (运算符相邻时谁先运算 )( 见下页 )
1+3*5,1+2+3
? 运算符的结合性 (解决优先级相同的情况下,谁先运算的问题 )
? 左结合性:从左到右的次序运算,大部分均是
? 右结合性:从右到左的次序运算,常见的有,
!,~,++,- -,-,( 类型 ),*,&,sizeof,?,、赋

举例,i=5 ; - i++
附,Turobo C运算符的优先级
,
运算符
算术运算符
运算符
强调和技巧
? 两个整数相除 5/3,结果应为整数 1,又如
int x=3510 ; x=x / 1000 * 1000结果为多少?
? %只能对两个整数进行运算,5/3.2错误
? %取模运算中,摸数和被摸数为负数的情况
? 举例 23%3,23%-3,-23%3,-23%-3
结果为 2,2,-2,-2
? 规律:摸数为负数时,将负号忽略即可;若被取模的
数是负数时,先忽略负数,然后将结果置为负
运算符
? 分析 (i++)+(i++)+(i++)的结果
int i=3,a;a=(i++)+(i++)+(i++);printf("a=%d,i=%d\n",a,i);
结果为,a=9,i=6
int i=3;
printf("(i++)+(i++)+(i++)=%d,i=%d\n",(i++)+(i++)+(i++),i);
结果为,(i++)+(i++)+(i++)=12,i=3
我的理解,在赋值语句中,对 x++是先取值运算,再赋值,最后 x自加
1;而在函数的参数中,则是从右到左,对各个子表达式进行运算
举一反三,
? 分析 (++i)+(++i)+(++i)的结果?答案是,18,6和 15,3
? 再分析 x=0;x=x++%10;printf(“%d\n”,x);的输出结果?
答案是,1
解释:取 x++的值 0 ; 0%10为 0; x=0;最后 X自加 1
? a=3;a=a+(a=a-a*a++)的结果为 a=11
运算符
? 思考题 1:某个培训中心要为新到的学员安排房间,假设
共有 x个学员,每个房间可以住 6人,让你用一个公式来计
算他们要住的房间数(不允许男女混住)?
正确答案,(x+5)/6,错误答案,x/6+1。上述算法还可以在
查看留言板的分页显示上:其中 x是总共的留言数,结果
就是总共有多少页。
? 思考题 2:假设你要让 x的值在 0到 9之间循环变化请写出相
应的程序代码。
答案,int x= 0,j=0;
while(j<20)
{
x=x%10;printf(“%d”,x);x++;j++;
}
举一反三:在 15到 25之间循环变化。答案如下,
a=15+(x=x%11);printf(“a=%d\n”,a);x++;j++;
运算符
赋值运算符
=, +=,-=,*=,/=,%=,>>=,<<=,&=,|=,^=
分析 int x=15,y=3;y*=x-2;y的结果
其中 y*=x-2相当于 y=y*(x-2),而不是 y=y*x-2
赋值运算中的数据类型转换
? 在赋值运算中,赋值运算符两边的类型不一致时类型转换规则是
等号右边的值转换为等号左边变量所属的类型。
例如,
main()
{
int i,j; /*定义整型变量 */
float f,g=2.58; /*定义浮点型变量 */
f=i*j; /*i与 j的乘积是整型数,被转换成为浮点数赋给 f*/
i=g; /*g中的浮点型数转换成为整型数赋给 i*/
,.,
}
运算符
赋值语句中的数据类型转换(续)
? 特别注意:作除法运算时
例如,
main()
{
float f;
int i=15;
f=i/2;
}
上面程序经运行后,f=7并不等于准确值 7.5。正确的程序应该是,
main()
{
float f;
int i=15;
f=i/2.0;
}
也可直接将 i定义为浮点数。
运算符
赋值表达式
由赋值运算符或复合赋值运算符, 将一个变量和一个表达式
连接起来的表达式, 称为赋值表达式 。
? 一般格式
变量 (复合)赋值运算符 表达式
? 赋值表达式的求解过程及其值
? 求解过程:将赋值运算符中右边的表达式的值赋给左侧的变
量, 其值为被赋值变量的值 。
? 例如,, a = 5”这个赋值表达式, 变量 a的值, 5, 就是它的
值 。
? 赋值运算符的优先级和结合性
分析下面的语句
? a=b=c=5;
? a=3;x=a-=a++; 结果为 x=1,a=1
次最低优先级, 右结合性
运算符
逗号运算符和逗号表达式
在C语言中逗号“,”也是一种运算符,称为逗号运算符。
其功能是把两个表达式连接起来组成一个表达式,称为逗号
表达式。
其一般形式为,
表达式 1,表达式 2
求值过程:从左到右,分别求两个表达式的值,并以表达式 2
的值作为整个逗号表达式的值。
优先级:最低;结合性:从左到右
举例,
main(){
int a=2,b=4,c=6,x,y;
y=((x=a+b),(b+c));
printf("y=%d,x=%d",y,x); /*显示结果为 y=10,x=6*/
}
运算符
本例中,y等于整个逗号表达式的值,也就是表达式 2的值,
x是第一个表达式的值。
对于逗号表达式还要说明几点,
? 逗号表达式一般形式中的表达式 1和表达式 2 也可以又是逗
号表达式。
例如,
表达式 1,(表达式 2,表达式 3)
形成了嵌套情形。因此可以把逗号表达式扩展为以下形式,
表达式 1,表达式 2,… 表达式 n
整个逗号表达式的值等于表达式 n的值。
? 程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。
? 并不是在所有出现逗号的地方都组成逗号表达式,如在变
量说明中,函数参数表中逗号只是用作各变量之间的间隔符。
关系运算符和逻辑运算符
关系运算符
关系运算符是比较两个操作数大小的符号。
Turbo C的关系运算符如下,
━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━
操作符 作用
─────────────────────────────
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━
关系运算符和逻辑运算符
逻辑运算符
Turbo C的逻辑运算符如下,
━━━━━━━━━━━━━━━━━━━━
操作符 作用
──────────────────── &&
逻辑与
|| 逻辑或
! 逻辑非
━━━━━━━━━━━━━━━━━━━━
关系运算符和逻辑运算符
关系运算符和逻辑运算符的关键是真 (true)和假 (false)
的概念。 Turbo C中 true可以是不为 0的任何值,而 false
则为 0。 使用关系运算符和逻辑运算符表达
式时,若表达式为真 (即 true)则返回 1,否则,表达式为假
(即 false),则返回 0。
例如,
100>99 返回 1
10>(2+10) 返回 0
!1&&0 返加 0
对上例中表达式 !1&&0,先求 !1和先求 1&&0将会等
于出不同的结果,那么何
者优先呢? 这在 Turbo C中是有规定的。 有关运算符的
优先级本节后面将会讲到。
关系运算符和逻辑运算符
按位运算符
Turbo C和其它高级语言不同的是它完全支持按位运算符。这与
汇编语言的
位操作有些相似。
Turbo C中按位运算符有,
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
操作符 作用
────────────────────────────
& 位逻辑与
| 位逻辑或
^ 位逻辑异或
~ 位逻辑反
>> 右移
<< 左移
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
关系运算符和逻辑运算符
按位运算是对字节或字中的实际位进行检测、
设置或移位,它只适用于字符型和整数型变量
以及它们的变体,对其它数据类型不适用。
关系运算和逻辑运算表达式的结果只能是 1
或 0。 而按位运算的结果可以取 0或 1以外的值。
要注意区别按位运算符和逻辑运算符的不同,
例如,若 x=7,则 x&&8 的值为真 (两个非零值相
与仍为非零 ),而 x&8的值为 0。
关系运算符和逻辑运算符
移位运算符,>>”和,<<”是指将变量中
的每一位向右或向左移动,其通常形式为,
右移, 变量名 >>移位的位数
左移, 变量名 <<移位的位数
经过移位后,一端的位被“挤掉”,而
另一端空出的位以 0 填补,所以,Turbo
C中的移位不是循环移动的。
条件运算符
Turbo C的特殊运算符
一,"?"运算符
"?"运算符是一个三目运算符,其一般形式是,
<表达式 1>?<表达式 2>:<表达式 3>;
"?"运算符的含义是, 先求表达式 1的值,如果为真,则求表达式 2
的值并把
它作为整个表达式的值 ; 如果表达式 1 的值为假,则求表达式 3 的
值并把它作为
整个表达式的值。
例如,
main()
{
int x,y;
x=50;
y=x>70?100:0;
}
单目操作符
本例中,y将被赋值 0。如果 x=80,y将被赋值 100。
因此,"?"运算符可以代替某些 if-then-else形式的语句。
二,"&"和 "*"运算符
"&"运算符是一个返回操作数地址的单目操作符。
"*"运算符是对 "&"运算符的一个补充,它返回位于这个地址内的
变量值,也是单目操作符。
例如,
main()
{
int i,j,*m;
i=10;
m=&i; /*将变量 i的地址赋给 m*/
j=*m; /*地址 m所指的单元的值赋给 j*/
}
上面程序运行后,i=10,m为其对应的内存地址,j的值也为 10。
","运算符
三,","运算符
","运算符用于将多个表达式串在一起,","运算符的左
边总不返回,右边表达式的值才是整个表达式的值。
例如,
main()
{
int x,y;
x=50;
y=(x=x-5,x/5);
}
上面程序执行后 y值为 9,因为 x的初始值为 50,减 5后变
为 45,45除 5为 9赋给 y。
求字节长度
四,sizeof运算符
sizeof运算符是一个单目运算符,它返回变量
或类型的字节长度。
例如,
sizeof(double) 为 8
sizeof(int) 为 2
也可以求已定义的变量,例如,
float f;
int i;
i=sizeof(f);
则 i的值将为 4。
位运算符,将两个数据按照位进行运算。
位运算符有六
种位运算符,
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
例如,
3&4,3|4,-3&-4
其运算过程是,
按位与运算,1.两个二进位均为 1时,结果位才
为 1,否则为 0; 2.按位与运算通常用来对某些位
清 0或保留某些位。
例如把 a 的高八位清 0,保留低八位,可作
a&255运算 ( 255 的二进制数为 00000000
11111111)。
按位或运算,1.只要对应的二个二进位有一个为
1时,结果位就为 1; 2.或运算通常用来对某些位
置 1。
如将 a的低 8位置 1,a|255
按位异或运算,当两对应的二进位相异时,结果
为 1例如 9^5可写成算式如下,
00001001
^00000101
00001100 (十进制为 12)
异或运算可以用来使特定位翻转,如有 00000000
01111010,想使其低 4位翻转,可以将其与 00000000
00001111进行异或运算,
00000000 01111010
00000000 00001111
------------------------
00000000 01110101
用异或运算实现“交
换两个值,不用临时变
量”
设 a=3,b=4。想将 a和 b
的值互换可以这样,
若用 A和 B分别表示 3,
4
1.a=a^b; a=A^B
2.b=b^a; b=B^A^B=A
3.a=a^b; a=A^B^A=B
【 例 】
main(){
int a=9;
a=a^5;
printf("a=%d\n",a); }
求反运算
求反运算符~为单目运算符,具有 右结
合性 。其功能是对参与运算的数的各二
进位按位求反。
例如~ 9的运算为,
~(0000000000001001)结果为:
1111111111110110
左移运算
其功能把,<<,左边的运算数的各二进
位全部左移若干位,由,<<”右边的数
指定移动的位数,高位丢弃,低位补 0。
例如,a<<4 指把 a的各二进位向左移
动 4位。如 a=00000011(十进制 3),左移 4
位后为 00110000(十进制 48)。
高位左移后益出,舍弃不起作用。
左移位的作用:一个数左移一位相当于
乘以 2
右移运算
其功能是把,>>,左边的运算数的各二进位全
部右移若干位,,>>”右边的数指定移动的位
数。
例如:设 a=15,a>>2
表示把 000001111右移为 00000011(十进制 3)。
对于有符号数,在右移时,符号位将随同移动。
Turbo C当为正数时,最高位补 0,而为负数时,
符号位为 1,最高位是补 1。
int a=0x8000,b;b=a>>3;
结果为 f000 (即
1111 0000 0000
0000,提示:
a=1000 0000 0000
0000)
unsigned
a=0x8000,b;b=a>>3
结果为 1000 (即
0001 0000 0000
0000)
举例
main(){
unsigned a,b;
printf("input a number,");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d\tb=%d\n",a,b);
}
请再看一例 !
返回
main(){
char a='a',b='b';
int p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}
结束