第四章 初窥天机之运算符与表达式

添加文字有关运算符和表达式的知识。

4.1 算术运算符与表达式

什么是算术运算符?简单的说就是加、减、乘、除。这些大家应该小学,不,幼儿园就开始学习了。算术运算符就是这些符号的名称,而算术表达式则是对这些名称的使用。比如算术运算符“+”。算术表达式就是“a+b”了。是不是很简单,其实编程本来就是一件简单的事情。

在C语言有很多算术表达式,表4.1列举了部分关系表达式。

表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列就是关系表达式的具体使用。

表4.2 关系运算符

运算符

描述

结合性

例子

优先级

缩写

<

小于

从左向右

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所示:

图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所示。

表4.3 逻辑运算符

运算符

描述

结合性

例子

优先级

!

逻辑非

从右向左

a

!a

 

15

&&

逻辑与

从左向右

a

b

a&&b

 

5

||

逻辑或

从左向右

a

b

a||b

 

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 三目运算符

通过图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赋值给变量c
	printf("a>b?5:6的结果:%d\n", c);//输出三目运算之后的结果,无特殊说明以后同理
	c = a<b?b+1:6;//如果a小于b,则b+1赋值给变量c,否则6赋值给变量c
	printf("a<b?b+1:6的结果:%d\n", c);
	c = a>=b?'A':'Z';//如果a大于等于b,则字符‘A’赋值给变量c,否则‘Z’赋值给变量c
	printf("a>=b?'A':'Z'的结果:%d\n", c);
	c = a<=b?'a':'z';//如果a小于等于b,则字符‘a’赋值给变量c,否则‘z’赋值给变量c
	printf("a<=b?'a':'z'的结果:%d\n", c);
	c = a!=b?a+b:a-b;//如果a不等于b,则a+b的值赋值给变量c,否则a-b的值赋值给变量c
	printf("a!=b?a+b:a-b的结果:%d\n", c);
	c = a==b?a>b:a<b;//如果a等于b,则a>b的关系运算结果赋值给变量c,否则a>b的关系运算结果赋值给变量c
	printf("a==b?a>b:a<b的结果:%d\n", c);
	printf("a==b?\"bad\":\"Good\"的结果:%s\n", a==b?"bad":"Good");//如果a等于b输出字符串bad,否则输出Good
	return 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”。平年就算过程一样,这里就不再赘述。

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章