C语言中,运算符和表达式数量之多,在其他高级语言中是很少见的
正是丰富的运算符和表达式使C语言功能十分完善,这也是C语言的特点之一
本文介绍其中的一部分运算符,其他的运算符将陆续在后续各文中讲述
赋值运算符和赋值表达式
赋值运算符有“=”、“+=”、“-=”、“*=”、“/=”和“%=”等
用赋值运算符将运算对象连接而成的表达式称为赋值表达式
简单赋值运算符
将“=”右边表达式的值赋给左边的变量
例如:?a=8; 、?s=a*2+b;
先计算出右边表达式的值,再赋给左边的变量。如果“=”左右两边类型不同,系统会按照赋值类型转换的原则将右边的类型转换成左边的类型
复合赋值运算符
在简单赋值运算符前面加上算术运算符就构成复合算术赋值运算符,如下表所示:
运算符? ? ? ? ? ? ? ? ? ? ? ? ? 应用举例? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?等阶形式
+= | a+=x | a=a+(x) | -= | a-=x | a=a-(x) | *= | a*=x | a=a*(x) | /= | a/=x | a=a/(x) | %= | a%=x | a=a%(x) |
赋值表达式
由赋值运算符将一个变量和一个表达式连接起来的式子所组成。一般形式为:变量 = 表达式
下面是赋值表达式的例子:
1
2
3
| v=4.0*PI*r*r*r/3.0
a=15+(i=6)
b=(x=3)+(y=4) |
而?3=x ?和?a+b=4 ?都是错误的赋值表达式
赋值表达式的执行过程是:
- 计算赋值运算符右侧表达式的值;
- 将所计算出的值赋给赋值运算符左侧的变量
TIPS:
赋值运算符的左边只能是变量,不能是常量或表达式 赋值表达式的值就是赋值运算符左边变量的值 赋值表达式的右边也可以是一个赋值表达式
如下例题:
例:若有定义“int x=15,a,b;”,则表达式“x%=(a=3)+(b=4)”的值是 ?
答案:
- x%=(a=3)+(b=4)
- x%=3+4
- x%=7
- x=x%7
- x=15代入得:
- x=15%7=1
例:已有声明“int x=15, y; float z=12;”,下列表达式中语法正确的是 。 A.y=x%z B.y=x+=z*=4 C.y=x/2=z D.(y=x+3)=z/2
答案:B
算数运算符和算数表达式
基本的算术运算符
TIPS:
两个整型数据做除法运算时,结果一定是整数 求余运算的结果是两个整型数据相除的余数。求余运算只能用于整型数据的运算 算数运算符两边的数据类型应相同,若不同时,编译系统会先转换为同一数据类型,然后再进行运算
单目运算符
- ?负号:负数++ ?自增运算符:使变量的值自加1-- ?自减运算符:使变量的值自减1
有两种使用形式:
- 前缀方式:用于变量前面,它是?“先计算,后使用”
- 后缀方式:用于变量后面,它是?“先使用,后计算”
例:设有定义如下: #define d 2 int x=5; float y=3.83; char c=’d’; 分析以下各表达式使用正确与否: A.(-x)++ B.y++ C.c++ D.d++
答案:A错 B对 C对 D错
算术运算符的优先级和结合性
- 单目运算符的优先级高于双目运算符
- 双目算术运算符中*、/、%的优先级高于+、-
- 在优先级相同的情况下,按规定的“结合方向”进行处理
算术表达式
- 算术表达式是由算术运算符、运算对象和括号连接起来的式子
- 所有的数学表达式均可写成C语言的算术表达式,但是有些数学表达式无法直接用C语言的算术表达式写出,此时需要调用C语言中的数学函数来实现
- TIPS:
表达式中的乘号不能省略,且表达式中的所有字符均应写在同一行上 在表达式中还可以使用多层圆括号(不能使用中括号[]和花括号{}),但是要注意括号的配对 在数学中,5×6÷4的运算结果与6÷4×5的结果相同,都是 7.5,但是C语言中表达式56/4的结果却与6/45的结果不一样 还需注意 8/(8/10)之类的表达式,因为(8/10)的结果为 0,用0做除数将会出现运算溢出的错误,为了不使 8/10 的结果为 0,应将整型常量改为实型常量8.0/10
举个例子:
例:输入一个三位正整数,输出其反序数
1 #include<stdio.h>
2 int main()
3 {
4 int number = 456;
5 int a = number / 100; /* 计算百位数 */
6 int b = (number - a * 100) / 10; /* 计算十位数 */
7 int c = number % 10; /* 计算个位数 */
8 printf("反序数是:%d%d%d\n", c, b, a); /* 输出*/
9 return 0;
10 }
运行结果:反序数是:321
逗号运算符和逗号表达式
逗号运算符(,):功能是把多个表达式连接起来组成一个表达式,称为逗号表达式
逗号表达式的一般形式为:
表达式1,表达式2,…,表达式n
- 逗号表达式的执行顺序:从左到右依次执行每个表达式
- 逗号表达式的值为“表达式n”的值
- 逗号运算符是双目运算符,其优先级最低,是左结合的
- 并非所有出现逗号的地方都可以作为逗号表达式,如
printf("%d%d",&a,&b) ,其中的?"%d%d",&a,&b ?并不是一个逗号表达式,而是printf 函数的参数
例:逗号表达式应用示例
1 #include <stdio.h>
2 int main()
3 {
4 int i,j=7;
5 float k=5;
6 i=(j=j+2,j/k);
7 printf("i=%d\n",i);
8 return 0;
9 }
运行结果:i=1
求字节数运算符
sizeof(…):是一个单目运算符,用于计算数据类型所占的字节数,其一般格式为:
- sizeof(表达式)或sizeof 表达式
- sizeof(数据类型名)
例:不同数据类型字节数示例
?
1 #include<stdio.h>
2 int main()
3 {
4 printf("char类型占%d字节\n",sizeof(char));
5 printf("short int类型占%d字节\n",sizeof(short int));
6 printf("int类型占%d字节\n",sizeof(int));
7 printf("float类型占%d字节\n",sizeof(float));
8 printf("double类型占%d字节\n",sizeof(double));
9 return 0;
10 }
运行结果:
- char类型占1字节
- short int类型占2字节
- int类型占4字节
- float类型占4字节
- double类型占8字节
例:求字节数运算符示例
1 #include<stdio.h>
2 int main()
3 {
4 int a,b;
5 a=sizeof(3+5.0);
6 b=sizeof 3+5.0;
7 printf("%d,%d,%d\n",a,b,sizeof("china"));
8 return 0;
9 }
运行结果:8,9,6
|