本文主要是介绍第四章 初窥天机之运算符与表达式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
添加文字有关运算符和表达式的知识。
4.1 算术运算符与表达式
什么是算术运算符?简单的说就是加、减、乘、除。这些大家应该小学,不,幼儿园就开始学习了。算术运算符就是这些符号的名称,而算术表达式则是对这些名称的使用。比如算术运算符“+”。算术表达式就是“a+b”了。是不是很简单,其实编程本来就是一件简单的事情。
在C语言有很多算术表达式,表4.1列举了部分关系表达式。
运算符 | 描述 | 结合性 | 例子 | 优先级 |
+ | 加法运算符 | 从左向右 | a+b | 12 |
- | 减法运算符 | 从左向右 | a-b | 12 |
* | 乘法运算符 | 从左向右 | a*b | 13 |
/ | 除法运算符 | 从左向右 | a/b | 13 |
% | 取模运算符 | 从左向右 | a%b | 13 |
+ | 取正数(单目加) | 从右向左 | +a | 15 |
- | 取负数(单目减) | 从右向左 | -b | 15 |
注:更详细的信息,请参考附录B。
算术运算符类似于数学中的四则运算。但是又与四则运算有些不同,这与C语言本身的性质有关。C语言变量的定义需要指明数据类型,也就是说在程序运行前和运行后都是同一种类型(其他情况暂不考虑,如强制类型转换),指定类型的目的就是说明要分配的存储空间的大小。比如:
int a = 5,b=2,c;
c = 5/2;
那么此时c的值是多少呢?答案是2。在数学中毫无疑问5除以2结果是2.5。而此处结果是2,是因为c的类型是int,只接受整数2,后面的0.5自动被去掉。类似于数学中的取整运算。
【例4.1】 算术运算符与算术表达式
解题思路:我们只是用简单的算术运算符和算术表达式来进行简要的说明。程序中都是基本的加减乘除运算。由于学过上一章的scanf函数,我们可以尝试做一个简单计算器。
编写代码:
#include <stdio.h>
int main()
{int a=7, b=3;printf("a+b=%d\n", a+b);/*加法运算符*/printf("a-b=%d\n", a-b);/*减法运算符*/printf("a*b=%d\n", a*b);/*乘法运算符*/printf("a/b=%d\n", a/b);/*除法运算符*/printf("a%%b=%d\n", a%b);/*取模运算符,%号的输出需要多添加一个%*/printf("+a=%d, +b=%d\n", +a, +b);/*取正运算符*/printf("-a=%d, -b=%d\n", -a, -b);/*取负运算符*/return 0;
}
运行结果:
a+b=10
a-b=4
a*b=21
a/b=2
a%b=1
+a=7, +b=3
-a=-7, -b=-3
Press any key to continue
程序分析:这是一个很简单的程序。程序第9行多使用了一个“%”,因为要输出一个百分号需要多写一个“%”,即“%%”就会输出一个“%”。那为什么“/”,不可以呢?因为“/”是编译器级别的转义,“%”是printf()函数内部解析符号,所以不能用“/”。变量前面加一个‘-’表示负数。
注:
“%”号的作用:(1)“%”用于整数求余。(2)“%”号放在特定的大小写字母前表示控制输入输出格式。如%d、%x、%X等。
4.2 关系运算符与关系表达式
关系运算符是什么?就是我们小学里面学习的大于、小于、大于等于、小于等于、等于、不等于这些符号。而关系表达式就是对这些名称的具体使用罢了!在C语言中一共提供了6中关系运算符,如表4.2所示,第1列就是关系运算符,第4列就是关系表达式的具体使用。
运算符 | 描述 | 结合性 | 例子 | 优先级 | 缩写 |
< | 小于 | 从左向右 | a<b | 10 | LT |
<= | 小于或等于 | 从左向右 | a<=b | 10 | LE |
> | 大于 | 从左向右 | a>b | 10 | GT |
>= | 大于或等于 | 从左向右 | a>=b | 10 | GE |
== | 等于 | 从左向右 | a==b | 9 | EQ |
!= | 不等于 | 从左向右 | a!=b | 9 | NE |
注:优先级数字越大,优先级越高。详见附录B。
关系运算符的结果值只能是0或1。当关系运算符的值为真时,结果值为1。当关系运算符的值为假时,结果值为0。
除了关系运算符外,还有算术运算符,赋值运算符等。他们运算符的优先级如图4.1所示:

例如:
a > b + c; 先进行算术运算b+c,然后再进行关系运算a>(b+c)。算符运算符优先级大于关系运算符优先级。值得注意的是“>”和“>=”类似。
a = b < c; 先进行关系运算b<c,然后再进行赋值运算a=(b<c)。关系运算符优先级大于赋值运算符优先级。值得注意的是“<”和“<=”类似。
a = b + c; 先进行算术运算b+c,然后再进行赋值运算a=(b+c)。算术运算符优先级大于赋值运算符优先级。
a!=b+c;先进行算术运算b+c,然后再进行关系运算a!=(b+c)。算术运算符优先级大于关系运算符优先级。
【例4.2】关系运算符与关系表达式
程序分析:我们使用基本的关系运算符与关系表达式进行编程,程序中提供了小于、小于等于、大于、大于等于、等于不等于以及把关系运算计算过的结果赋值给另一个变量,或者进行比较等。
编写代码:
#include <stdio.h>
int main()
{int a=2, b=3, c=4;printf("a<b+c的值:%d\n", a<b+c);/*<*/printf("a<=b+c的值:%d\n", a<=b+c);/*<=*/printf("a>b+c的值:%d\n", a>b+c);/*>*/printf("a>=b+c的值:%d\n", a>=b+c);/*>=*/printf("a=b<c的值:%d\n", a=b<c);/*=*/printf("a=b+c的值:%d\n", a=b+c);/*=*/printf("a==b+c的值:%d\n", a==b+c);/*==*/printf("a!=b+c的值:%d\n", a!=b+c);/*!=*/return 0;
}
运行结果:
a<b+c的值:1
a<=b+c的值:1
a>b+c的值:0
a>=b+c的值:0
a=b<c的值:1
a=b+c的值:7
a==b+c的值:1
a!=b+c的值:0
Press any key to continue
程序分析:由图4.1我们知道了三种运算符的优先级。算术运算符大于关系运算符,关系运算符大于赋值运算符。程序第5行在“a<b+c”中,a<
b为关系运算符,b+c为算术运算符。由于算术运算符的优先级大于关系运算符,所以先计算b+c的结果为7,然后在判断a是否小于7。a为2,即a<7。关系成立,结果为1。程序往下分析同理。
4.3 逻辑运算符与逻辑表达式
在C语言中提供了三种逻辑运算符。他们分别是“!”,“&&”,“||”。事实上逻辑云算符与变量结合运算,并不改变变量的值,而是影响运算结果。它们的具体解释如表4.3所示。
运算符 | 描述 | 结合性 | 例子 | 优先级 | |||||||||||||||
! | 逻辑非 | 从右向左 |
| 15 | |||||||||||||||
&& | 逻辑与 | 从左向右 |
| 5 | |||||||||||||||
|| | 逻辑或 | 从左向右 |
| 4 |
注:通常0表示假,非0表示真。
逻辑运算符的结果只能是0或1。当逻辑运算符的值为真时,结果值为1。当逻辑运算符的值为假时,结果值为0。
【例4.3】逻辑运算符与逻辑表达式
解题思路:我们编程程序实现基本的逻辑运算,有取非、逻辑与(&&)、逻辑或(||)以及这三种的各种组合。
编写代码:
#include <stdio.h>
int main()
{int a=1,b=2;printf("a=%d,b=%d\n", a, b);//输出a,b的值printf("!a=%d,!b=%d\n", !a, !b);//输出非a,非b的值printf("a&&b=%d\n", a&&b);//输出a与b的逻辑与printf("!a&&b=%d\n", !a&&b);//输出非a与b的逻辑与printf("a&&!b=%d\n", a&&!b);//输出a与非b的逻辑与printf("!a&&!b=%d\n", !a&&!b);//输出非a与非b的逻辑与printf("a||b=%d\n", a||b);//输出a与b的逻辑或printf("!a||b=%d\n", !a||b);//输出非a与b的逻辑或printf("a||!b=%d\n", a||!b);//输出a与非b的逻辑或printf("!a||!b=%d\n", !a||!b);//输出非a与非b的逻辑或return 0;
}
运行结果:
a=1,b=2
!a=0,!b=0
a&&b=1
!a&&b=0
a&&!b=0
!a&&!b=0
a||b=1
!a||b=1
a||!b=1
!a||!b=0
Press any key to continue
程序分析:当a=1,b=2时,!a,!b的结果值就是0。a&&b的结果值是1。!a&&b与a&&!b的结果值为0,因为“!”的优先级(15)大于“&&”的优先级(5)。!a&&!b的结果值为0。a||b的结果值也是1!a||b与a||!b的结果值为1。!a||!b的结果值为0。所以就有了运行结果中的值。
4.4 条件运算符与条件表达式
条件运算符就是当你满足某种条件时去执行一种情况,不满足条件时去执行另一种情况。在C语言中存在一个唯一的三目条件运算符。三目运算符的优先级大于赋值运算符。
条件表达式的一般形式:
表达式1 ? 表达式2 : 表达式3
其中:“?”,“:”都是条件运算符。
该条件表达式的含义:经过运算,如果“表达式1”成立则执行“表达式2”。否则执行“表达式3”。通过图4.2我们可以直观的了解这样一个三目条件运算符。

通过图4.2我们会发现它和我们将要讲的if语句很相似,如下。
if(表达式1)
{
表达式2;
}
else
{
表达式3;
}
如果表达式1为真,则执行表达式2。如果表达式1为假(不为真),则执行表达式3。另外if-else我们将在后面介绍。
比如:
c=a>b?5:6;表示如果a大于b,就把5赋值给c。如果a不大于b,就把6赋值给c。当a等于2,b等于3时,判断知a不大于b,所以把6赋值给c。
c=a>b?b+1:6;由于算术运算符的优先级大于关系运算符大于条件运算符,所以先执行b+1,然后再执行关系运算符,最后执行条件运算符。当a等于5,b等于4时,首先执行b+1后值为5,接着判断知a大于b,所以把b+1的值赋值给c,所以c等于5。
c=a>=b?’A’:’Z’;表示如果a大于等于b,就把字符’A’的ASCII码值赋值给c。如果a小于b,就把’Z’的ASCII码值赋值给c。
c=a==b?a>b:a<b;由于关系运算符大于条件运算符,所以先进行关系运算符的运算然后进行条件运算符的运算。假设a等于1,b等于2的时,先执行a==b、a>b与a<b,它们执行后的结果分别为0、0和1,然后在执行三目运算符c=0?0:1,所以最终结果为c的值为1。具体实现请看代码例4.4。
【例4.4】三目运算符与三目表达式
解题思路:同样我们也是提供三目运算符与三目表达式相应代码,使用三目结构,在大于、小于、大于等于、小于等于不等于、相等等几种情况下的编码。
编写代码:
#include <stdio.h>
int main()
{int a=1,b=2,c;printf("a=%d, b=%d\n", a,b);c = a>b?5:6;//如果a大于b,则5赋值给变量c,否则6赋值给变量cprintf("a>b?5:6的结果:%d\n", c);//输出三目运算之后的结果,无特殊说明以后同理c = a<b?b+1:6;//如果a小于b,则b+1赋值给变量c,否则6赋值给变量cprintf("a<b?b+1:6的结果:%d\n", c);c = a>=b?'A':'Z';//如果a大于等于b,则字符‘A’赋值给变量c,否则‘Z’赋值给变量cprintf("a>=b?'A':'Z'的结果:%d\n", c);c = a<=b?'a':'z';//如果a小于等于b,则字符‘a’赋值给变量c,否则‘z’赋值给变量cprintf("a<=b?'a':'z'的结果:%d\n", c);c = a!=b?a+b:a-b;//如果a不等于b,则a+b的值赋值给变量c,否则a-b的值赋值给变量cprintf("a!=b?a+b:a-b的结果:%d\n", c);c = a==b?a>b:a<b;//如果a等于b,则a>b的关系运算结果赋值给变量c,否则a>b的关系运算结果赋值给变量cprintf("a==b?a>b:a<b的结果:%d\n", c);printf("a==b?\"bad\":\"Good\"的结果:%s\n", a==b?"bad":"Good");//如果a等于b输出字符串bad,否则输出Goodreturn 0;
}
运行结果:
a=1, b=2
a>b?5:6的结果:6
a<b?b+1:6的结果:3
a>=b?'A':'Z'的结果:90
a<=b?'a':'z'的结果:97
a!=b?a+b:a-b的结果:3
a==b?a>b:a<b的结果:1
a==b?"bad":"Good"的结果:Good
Press any key to continue
程序分析:此处是三目运算的运行结果。我们只需要记住三目运算符的使用规则就行了。形如1?2:3,如果公式1成立,执行2。否则执行公式3。所以按照此思想进行判断即可。程序第6行,首先判断a是否大于b,因为a为1,b为2,所以a>b不成立,即三目运算符最后的结果为6。最后把6赋值给c,所以程序第7行输出结果为6。以下的判断方式相同。
【例4.5】三目运算实现判断闰年
解题思路:这是一个三目运算的实际应用,我们采用三目运算符计算某一年是否是闰年。我们都知道闰年可以4整除且不可被100整除,或者被400整除。基于此思想我们使用两个三目运算符,第一个三目运算符先拿年份对100取余,如果余数为0,一定不是闰年。如果余数不为0,则说明有可能是闰年。然后我们再让年份取4的余数,判断余数是否为0,为0是闰年。否则不是闰年。
编写程序:
#include <stdio.h>
int main()
{int num;printf("请输入一个年份:");scanf("%d", &num);printf("%s\n", num%(num%100?4:400)?"No":"Yes");//判断年份是否是闰年return 0;
}
第一次运行结果:
请输入一个年份:2008
Yes
Press any key to continue
第二次运行结果:
请输入一个年份:2010
No
Press any key to continue
程序分析:在printf()函数中我们发现,它是两个三目条件运算符的结合。我们首先根据运算符的优先级,然后再进行运算。由于括号的优先级大于三目运算符的优先级,所有我们会先计算num%100?4:400,假设我们输入的年份是闰年2008年,则num值为2008,num%100的值为8,不等于0为真(即2008不能被100整除),所以括号内的计算结果为4。然后再运算num%4?”No”:”Yes”,由于2008%4的值为0,所以就有0?”No”:”Yes”表达式,所以最终结果值为“Yes”。平年就算过程一样,这里就不再赘述。
这篇关于第四章 初窥天机之运算符与表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!