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 2 3 4 5 6 7 8 9 10 |
#include<stdio.h> int main() { int number = 456; int a = number / 100; /* 计算百位数 */ int b = (number - a * 100) / 10; /* 计算十位数 */ int c = number % 10; /* 计算个位数 */ printf("反序数是:%d%d%d\n", c, b, a); /* 输出*/ return 0; } |
运行结果:反序数是:321
逗号运算符和逗号表达式
逗号运算符(,):功能是把多个表达式连接起来组成一个表达式,称为逗号表达式
逗号表达式的一般形式为:
表达式1,表达式2,…,表达式n
- 逗号表达式的执行顺序:从左到右依次执行每个表达式
- 逗号表达式的值为“表达式n”的值
- 逗号运算符是双目运算符,其优先级最低,是左结合的
- 并非所有出现逗号的地方都可以作为逗号表达式,如
printf("%d%d",&a,&b)
,其中的"%d%d",&a,&b
并不是一个逗号表达式,而是printf
函数的参数
例:逗号表达式应用示例
1 2 3 4 5 6 7 8 9 |
#include <stdio.h> int main() { int i,j=7; float k=5; i=(j=j+2,j/k); printf("i=%d\n",i); return 0; } |
运行结果:i=1
求字节数运算符
sizeof(…):是一个单目运算符,用于计算数据类型所占的字节数,其一般格式为:
- sizeof(表达式)或sizeof 表达式
- sizeof(数据类型名)
例:不同数据类型字节数示例
1 2 3 4 5 6 7 8 9 10 |
#include<stdio.h> int main() { printf("char类型占%d字节\n",sizeof(char)); printf("short int类型占%d字节\n",sizeof(short int)); printf("int类型占%d字节\n",sizeof(int)); printf("float类型占%d字节\n",sizeof(float)); printf("double类型占%d字节\n",sizeof(double)); return 0; } |
运行结果:
- char类型占1字节
- short int类型占2字节
- int类型占4字节
- float类型占4字节
- double类型占8字节
例:求字节数运算符示例
1 2 3 4 5 6 7 8 9 |
#include<stdio.h> int main() { int a,b; a=sizeof(3+5.0); b=sizeof 3+5.0; printf("%d,%d,%d\n",a,b,sizeof("china")); return 0; } |
运行结果:8,9,6