在C语言中几乎每一个程序都是需要进行运算的,对数据进行加工处理,否则程序就没有意义了。要进行运算,就需要规定可以使用的运算符。在了解具体的运算符之前,我们先了解以下三个术语和两个概念:
(1)运算符:参加各种运算的符号。(比如:+-*/ )
(2)操作数:参加具体运算的数据对象。(常量、变量、函数 比如:3+5、i-1)
(3)表达式:由运算符和操作数连接起来组成的式子。(比如:1+2+5、2*5-3、5/6)
优先级:是指在表达式中运算符的执行顺序。
结合性:指操作数与运算符结合的方向,分为左结合,右结合两种。左结合是指从左向右结合执行运算,右结合指从右向左结合执行运算。
一、算术运算符
1.1 单目运算符
就像-6,+3这种操作符两端只有一个操作数,就叫单目操作符。
运算符 | 含义 | 举例 |
+ | 正号 | +5 |
- | 负号 | -5 |
注意:+ - 作为正负号时,具有较高优先级,要先进性运算。它的结合性为右结合。(所谓的右结合就是运算时从右往左)
举例:已知 i=3,则 -i 的值等于多少?
解析:这时 i=3,则 -i 会先取i的值3,然后进行取负运算,得到的就是 -3。
1.2 双目运算符
就像 2+3 这种位于操作符两端共有两个操作数,这种操作符叫双目操作符。
运算符 | 含义 | 举例 |
+ | 加法运算符 | a+b |
- | 减法运算符 | a-b |
* | 乘法运算符 | a*b |
/ | 除法运算符 | a/b |
% | 求余运算符 | a%b |
1.2.1 +和-用来完成加减法
1 #include <stdio.h>
2 int main( )
3 {
4 int x = 6 +23 ;
5 int y = 61 - 17 ;
6 printf("%d\n",x);
7 printf("%d\n",y);
8 return 0;
9 }
1.2.2 运算符*用来完成乘法
1 #include <stdio.h>
2 int main( )
3 {
4 int n = 5 ;
5 printf("%d\n",n * n); //输出25
6 return 0;
7 }
1.2.3 运算符/用来完成除法
1 #include <stdio.h> 2 int main( ) 3 { 4 int m = 6 / 3 ; 5 printf("%d\n",m); //输出2 6 return 0; 7 }
除号的两端都是整数的时候,计算的是整数除法,得到的结果也是整数。
1 #include <stdio.h>
2 int main( )
3 {
4 float n = 6 / 4 ;
5 printf("%f\n", n); // 输出1.000000
6 return 0;
7 }
上面示例中,尽管 变量n的类型是float型,但是6/4得到的结果是1.0。这是因为在C语言里面的整数除法是整除,只会返回整数部分,而小数部分会被丢弃。
如果有人说我就是想要得到一个浮点数的结果,那怎么办呢?
1 #include <stdio.h>
2 int main( )
3 {
4 float n = 6.0 / 4 ;
5 printf("%f\n", n); // 输出1.500000
6 return 0;
7 }
上面示例,如果希望得到的结果是浮点数,那么两个运算数必须至少有一个浮点数。
1 #include <stdio.h>
2 int main( )
3 {
4 float n = 6 / 4.0 ;
5 printf("%f\n", n); // 输出1.500000
6 return 0;
7 }
1.2.4 运算符%用来完成求模
运算符%表示求模运算,就是返回两个整数相除之后余数的值。
#include <stdio.h>
int main( )
{
int x= 5 / 4 ;
printf("%d\n", x); // 输出 1
return 0;
}
注意:
#include <stdio.h>
int main( )
{
printf("%d\n", 13 % -3); // 输出 1
printf("%d\n", -13 % -3); // 输出 -1
printf("%d\n", -13 % 3); // 输出 -1
return 0;
}
二、 ++ 和 --
自增(减)表达式:根据自增(减)符号在变量旁边的位置,分别为前缀表达式和后缀表达式。
注意:自增自减只针对1个变量。
前缀表达式:++i ++j --i --j
后缀表达式:i++ j++ i-- j--
2.1 前置++
计算口诀:先加1,后使用
1 int a = 10 ;
2 int b = ++a ; //相当于a=a+1; b=a
3 printf("a=%d b=%d",a,b); //a=11 b=11
a的值是10,通过自增先+1,然后a=11,再使用就是赋值给b,b得到的值也是11。
2.2 后置++
计算口诀:先使用,后+1
1 int a = 10 ;
2 int b = a++ ; //相当于a=b a=a+1
3 printf("a=%d b=%d",a,b); //a=11 b=10
a的值是10,先使用,就是先将a的值赋给b,b的值就是10,然后a再+1,a变成了11。
2.3 前置--
计算口诀:先-1,后使用
1 int a = 10 ;
2 int b = --a ; //相当于a-1 b=a-1
3 printf("a=%d b=%d",a,b); //a=9 b=9
a的值是10,通过自减先-1,然后a=9,再使用就是赋值给b,b得到的值也是9。
2.4 后置--
计算口诀:先使用,后-1
1 int a = 10 ;
2 int b = a --; //相当于b=a a=a-1
3 printf("a=%d b=%d",a,b); //a=9 b=10
a的值是10,先使用,就是先将a的值赋给b,b的值就是10,然后a再-1,a变成了9。
三、赋值运算符
在变量创建的时候给一个初始值叫初始化,在变量创建好后,再给一个值,这叫赋值。
3.1 简单赋值运算符:=
1 int a = 10; //初始化
2 a=20; //赋值
赋值操作符 = ,赋值号的左边只能是一个变量,不能是常量或是表达式。且赋值运算符结合性是右结合,即从右至左进行运算。
3.2 复合赋值运算符
复合赋值运算符就是将算术运算符和赋值运算符结合在一起
+= | -= | *= | /= | %= |
如:已知 int a = 5;
1 a=a+3 //相当于a+=3
2 a=a-3 //相当于a-=3
3 a=a*3 //相当于a*=3
4 a=a/3 //相当于a/=3
5 a=a%3 //相当于a%=3
当赋值符号左右两边数据类型不一致时,根据左边的变量类型,取右边的值
1 int a ;
2 a=3.14;
3 a=? //a=3 只取整
1 fioat a;
2 int b;
3 b=3;
4 a=b;
5 a=? //a=3.0 存放为实数
四、关系运算符及表达式
4.1 表达式
什么叫表达式真假?在C语言中,非0表示真,0表示假。
(1)从逻辑上看:
- 表达式成立,则为真,用1表示
- 表达式不成立,则为假,用0表示
如:3<5 ,表达式3确实小于5,表达式为真,用1表示
(2)从表达式的值看:
- 表达式的值为0,则为假(0)
- 表达式的值为真,则为真(1)
如:2%2,表达式的值为0,则表达式为假,用0表示
4.2 关系运算符
表示两值之间的大小关系的运算符就是关系运算符。
> | 大于运算符 |
< | 小于运算符 |
>= | 大于等于运算符 |
<= | 小于等于运算符 |
== | 相等运算符 |
!= | 不相等运算符 |
结合性:左结合
优先级:内部两级
< | 优先级相同(高) |
>= | |
> | |
>= | |
== | 优先级相同(低) |
!= |
五、逻辑运算符
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符:
&& | 与运算符,就是并且的意思 |
|| | 或运算符,就是或者的意思 |
! | 逻辑取反运算符 |
5.1 与运算符
&&(与运算符):两侧的表达式都为真,则为真,否则为假。
如:小杨请两名18岁的男生吃饭
两个条件同时满足,1是男性,2必须是18岁以上。
a | b | a&&b |
真 | 真 | 真 |
真 | 假 | 假 |
假 | 真 | 假 |
假 | 假 | 假 |
比如:6月份到8月份是春天,用代码怎么表示?
#include <stdio.h>
int main()
{
int month = 0;
scanf("%d",&month);
if(month >= 6 &&month <= 8)
{
printf("summer\n");
}
return 0;
}
5.2 或运算符
||(或运算符):两侧的表达式只要有一个为真,整个表达式就是真。
如:小杨请两名男生或18岁的学生吃饭。
两个条件满足一个即可,男生或者18岁以上。
a | b | a||b |
真 | 真 | 真 |
真 | 假 | 真 |
假 | 真 | 真 |
假 | 假 | 假 |
比如:一年中12月或者1月或者2月是冬天,代码表示
#include <stdio.h>
int main()
{
int month = 0;
scanf("%d",&month);
if(month == 12||month == 1||month == 2)
{
printf("%d\n",month);
}
return 0;
}
5.3 非运算
!(非运算):逻辑取反
如:小杨请两名非男生学生吃饭。
男生的反,就是女生。
a | !a |
真 | 假 |
假 | 真 |
比如:有一个变量flag,如果flag为假,要做一个什么事情,代码就可以写成:
#include <stdio.h>
int main()
{
int flag = 0;
if(flag!=0)
{
printf("do something\n");
}
return 0;
}
例:输入一个年份,判断是否是闰年
闰年的判断规则:
- 能被4整除并且不能被100整除是闰年
- 能被400整除是闰年
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
printf("%d是闰年\n", year);
return 0;
}
注意:
短路现象:在逻辑表达式中,结果能确定后,后面的就不再运算。
例1:a && b && c
- a为假时,整个表达式的值都为假,b、c则不需要判断
- a为真时,才判别b的值;a、b都为真时,才判别c的值
例2:a || b || c
- a为真时,整个表达式的值都为真,则b、c不需要判断
- a为假时,继续判断b的值;a、b都为假时,才判断c的值
六、条件运算符
条件运算符也叫三目操作符,需要接受三个操作数的,形式如下:
exp1 ? exp2 : exp3
条件运算符的计算逻辑是:
- 如果exp1结果为真,执行exp2,计算的exp2的结果是整个表达式的结果;
- 如果exp1为结果假,执行exp3,计算的exp3的结果是整个表达式的结果。
例:使用推荐运算符实现找两个数中较大值
#include ,<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d%d",&a,&b);
int m = (a>b ? a : b);
printf("%d\n",m);
return 0;
}
七、逗号运算符
逗号运算符:,
逗号表达式:由逗号分隔的多个表达式组合而成,包含的表达式称为子表达式。
格式:exp1,exp2,exp3[,...]
左结合:逗号表达式会从左向右依次计算。
逗号表达式的值:最后一个表达式的值为整个逗号表达式的值。
#include <stdio.h>
int main()
{
int b = 0,c = 4;
int a =(a=3,a+3,b=c*3,c=2*a+b)
printf("a=%d\n",a) //输出a=18
return 0;
}
八、总结归纳各类运算符的优先级:
单目运算符>算术运算符>关系运算符>逻辑运算符(不包括!)>条件运算符>赋值运算符>逗号运算符