C 程序设计教程(06)—— C 语言的运算符与表达式
该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。
目录
- C 程序设计教程(06)—— C 语言的运算符与表达式
- 一、算术运算
- 1、算术运算符
- 2、自增和自减
- 3、算术表达式
- 二、关系和逻辑运算
- 1、关系运算符和逻辑运算符
- 2、关系表达式
- 3、逻辑表达式
- 三、赋值运算
- 1、赋值运算符
- 2、复合赋值运算符
- 3、赋值表达式
- 四、位运算
- 五、条件运算
- 六、逗号运算
运算是对数据进行各种处理,用来表示各种不同运算的符号称为运算符。C 语言提供了丰富的运算符,包括:算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符等。
一、算术运算
1、算术运算符
C 语言中的算术运算符如下表所示:
运算符 | 作用 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 模运算(求余) |
– | 自减(减1) |
++ | 自增(加1) |
说明:
(1)除法(/)用于整数和字符时,结果取整。
(2)模运算(求余)符不能用于 float 和 double 类型。
例如:
#include <stdio.h>
#include <string.h>
int main()
{
int a=12,b=5;
float f1=12.0,f2=5.0;
printf("%d\n",a/b);
printf("%f\n",f1/f2);
printf("%d\n",a%b);
return 0;
}
以上程序的运行结果如下:
2、自增和自减
自增(++)使操作数加1,自减(–)使操作数减 1。自增和自减运算符可以放在操作数之前(如:++x),也可以放在操作数之后(x++)。
如果自增和自减运算符在操作数之前,在引用操作数之前先执行加 1 或减 1 操作。如果自增和自减运算符在操作数之后,则先引用操作数的值,然后进行加 1 或减 1 操作。
例如:
#include <stdio.h>
#include <string.h>
int main()
{
int x=10,y=10,z;
z=++x;
printf("x=%d, z=%d\n",x,z);
z=y++;
printf("y=%d, z=%d\n",y,z);
return 0;
}
以上程序的运行结果如下:
算术运算符的优先级:(++、–)、-(负号)、(*、/、%)、(+、-)
3、算术表达式
用算术运算符、圆括号将运算对象(又称为操作数)连接起来符合 C 语言语法规则的式子,称为算术表达式。运算对象可以是常量、变量、函数等。
算术表达式书写时的注意事项:
(1)乘号不能省略。例如:4ab 应写作 4*a*b;
(2)只能使用系统允许的标识符。例如:2πr 应写作 2*3.1415926*r;
(3)不允许使用方括号和花括号,只能使用圆括号限定运算次序。可以使用多层圆括号,但左右括号必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。
例如:
#include <stdio.h>
#include <string.h>
# define PI 3.1415926
int main()
{
float r;
printf("请输入圆的半径:");
scanf("%f",&r);
printf("圆的周长为:%f\n",2*PI*r);
printf("圆的面积为:%f\n",PI*r*r);
return 0;
}
以上程序的运行结果如下:
二、关系和逻辑运算
1、关系运算符和逻辑运算符
关系运算符中的“关系”指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”指的是连接关系的方式。
在 C 语言中,非 0 为 TRUE,0 为 FALSE。关系表达式与逻辑表达式的返回值为 0(FALSE) 或 1(TRUE)。关系运算符和逻辑运算符如下表所示:
关系运算符 | 含义 | 逻辑运算符 | 含义 |
---|---|---|---|
> | 大于 | && | 与 |
>= | 大于或等于 | || | 或 |
< | 小于 | ! | 非 |
<= | 小于或等于 | ||
== | 等于 | ||
!= | 不等于 |
关系运算符和逻辑运算符的优先级:!、(>、>=、<、<=、==、!=),&&,||
2、关系表达式
关系表达式是指用一个关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式或字符表达式等)连接起来,进行关系运算的式子。关系表达式的值是一个逻辑值。例如:
#include <stdio.h>
int main()
{
int x=3,y=4,z=5;
printf("x>y:%d\n",x>y);//逻辑值假用0表示
printf("(x>y)!=z:%d\n",(x>y)!=z);//逻辑值真用1表示
printf("x<y<z:%d\n",x<y<z);//x<y为1,1<5为真
printf("(x<y)+z:%d\n",(x<y)+z);//x<y为1,1+5=6
return 0;
}
以上程序的运行结果如下:
3、逻辑表达式
逻辑表达式是用逻辑运算符将一个或多个表达式连接起来,进行逻辑运算的式子。通常用逻辑表达式表示多个条件的组合。
例如:
#include <stdio.h>
int main()
{
int year1=2000,year2=2100,result1,result2;
int num=12;
result1=(year1%4==0)&&(year1%100!=0)||(year1%400==0);
result2=(year2%4==0)&&(year2%100!=0)||(year2%400==0);
printf("2000年是否闰年:%d\n",result1);
printf("2100年是否闰年:%d\n",result2);
printf("!num:%d\n",!num);
printf("num||num>20:%d\n",num||num>20);
printf("num>=1&&num<31:%d\n",num>=1&&num<31);
return 0;
}
以上程序的运行结果如下:
三、赋值运算
1、赋值运算符
赋值符号 = 称为赋值运算符,将赋值运算符右边的表达式的值存储到以左边变量名为标识的变量中。赋值运算的格式为:
<变量>=<表达式>;
说明:
(1)赋值运算符的左边必须是变量,右边的表达式可以是常量、变量、表达式和函数。
例如:
x = 10;
y = x + 10;
y = func();
(2)赋值符号不同于等号(C 语言等号用 == 表示),它没有相等的含义。例如:x=x+1 表示取出变量 x 的值加 1 后,再存入变量 x 中。
(3)在一个赋值过程中,可以出现多个赋值运算符,其运算顺序是从右向左。例如:
#include <stdio.h>
int main()
{
int x,y,z;
x=y=z=2;
printf("z=%d\n",z); //先执行:z=2
printf("y=%d\n",y); //把赋值表达式(z=2,结果为2)的值赋给y
printf("x=%d\n",x); //把赋值表达式(y=2,结果为2)的值赋给x
return 0;
}
以上程序的运行结果如下:
2、复合赋值运算符
可以在赋值运算符 = 之前加上其他运算符,构成复合赋值运算符。所有的双目运算符都可以与赋值运算符一起组合成复合赋值运算符。格式为:
<变量><双目运算符>=<表达式>;
//等价于:
<变量>=<变量><双目运算符>=<表达式>;
//复合赋值运算符一共有10种
//+=、-=、*=、/=、%=、<<=、>>=、&=、^=、||=
例如:
#include <stdio.h>
int main()
{
int x = 2;
x += 10;
printf("x:%d\n",x); //x=12
x -= 2;
printf("x:%d\n",x); //x=10
x *= 4;
printf("x:%d\n",x); //x=40
x /= 2;
printf("x:%d\n",x); //x=20
return 0;
}
以上程序的运行结果如下:
3、赋值表达式
由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。格式如下:
<变量>=<表达式>;
赋值表达式求解的过程如下:
(1)先求解赋值表达式右边的表达式的值。
(2)将赋值运算符右侧表达式的值赋给左侧的变量。
(3)赋值表达式的值就是被赋值变量的值。
例如:赋值表达式 a=5 的值为 5,变量 a 的值也是 5。
(4)赋值表达式中的表达式也可以是一个赋值表达式。例如:
#include <stdio.h>
int main()
{
int x,y,z;
x=y=5;
printf("y=%d\n",y); //把赋值表达式(z=2,结果为2)的值赋给y
printf("x=%d\n",x); //把赋值表达式(y=2,结果为2)的值赋给x
z=(x=4)+(y=3);
printf("z=%d\n",z); //赋值表达式(x=4,结果为4),赋值表达式(y=3,结果为3)
return 0;
}
以上程序的运行结果如下:
(5)赋值表达式也可以包含复合的赋值运算符。例如:
#include <stdio.h>
int main()
{
int x=12,y;
y=x+=x-=x*x;
//(1)先执行 x-=x*x,x=12-144=-132
//(2)再执行x+=-132,x=-132-132=-264
//(3)把-264赋给y
printf("y=%d\n",y);
return 0;
}
以上程序的运行结果如下:
四、位运算
位运算是对字节或字中的位(bit)进行测试、置位或移位处理,字节或字针对 char 和 int 数据类型。位运算不能用于 float、double、long double、void 或其他复杂类型。位运算符如下:
运算符 | 含义 |
---|---|
& | 位与(AND) |
| | 位或(OR) |
^ | 异或(XOR) |
~ | 取反 |
>> | 右移 |
<< | 左移 |
移位运算符(>> 和 <<)将变量的各位按要求向右或向左移动。
右移语句形式为:变量>>右移位数
左移语句形式为:变量<<左移位数
左移一位等效于乘 2,右移一位等效于除 2。例如:
#include <stdio.h>
int main()
{
int x=8,y,z;
y=x<<1;
z=x>>1;
printf("y=%d\n",y);
printf("z=%d\n",z);
return 0;
}
以上程序的运行结果如下:
五、条件运算
C 语言提供了一个可以代替某些 if…then…else 语句的运算符 【?:】(条件运算符),格式为:
exp1?exp2:exp3;
说明:
(1)exp1 为逻辑表达式或关系表达式。
(2)如果 exp1 的值非 0,则计算 exp2,并将 exp2 的结果作为整个表达式的值。如果 exp1 的值为 0,则计算 exp3 的值,并将 exp3 的结果作为整个表达式的值。例如:
#include<stdio.h>
int main()
{
int x=5,y=10;
printf("%s\n",x%2==0?"偶数":"奇数");
printf("%s\n",y%2==0?"偶数":"奇数");
return 0;
}
以上程序的运行结果如下:
六、逗号运算
逗号运算符(,)将若干个表达式连接起来构成一个逗号表达式,格式为:
表达式1,表达式2,...,表达式n;
求解过程为:自左向右,先求解表达式1,再求解表达式2,…,最后求解表达式n,表达式n的值就是整个逗号表达式的值。
例如:
#include<stdio.h>
int main()
{
int x,y;
y=x=4*3,x*5,x+10; //计算4*3=12,将12赋给x,计算x*5=60,x+10=22,整个表达式的值为22
printf("%d\n",y);
return 0;
}
以上程序的运行结果如下: