项目四 运算符与表达式
项目概述
本项目主要讲C语言中的运算符与表达式,这一项目的内容又是C语言的基础内容,所以大家也要重视起来,不要落下。本项目有两个任务,任务一会介绍算术、自增自减、赋值、逗号运算符以及相关表达式,任务二我们还会学到比较运算符以及逻辑运算符,学好这两个运算符为我们以后学习选择结构和循环结构打下了基础,在任务二中我们还会学到sizeof运算符,这个运算符是来获取数据在内存中的字节,在学习的时候我们再做深入介绍,最好我们把运算符的优先级和结合性给做个总结。
项目目标
掌握算术、自增自减、赋值、逗号运算符以及表达式
掌握比较运算符和逻辑运算符及表达式
掌握sizeof运算的使用
掌握运算符的优先级与结合性
任务一 算术、自增自减、赋值、逗号运算符
任务描述
运算符是编程语言不可缺少的一部分,用于对一个数值或是多个数值进行运算。通过本任务的学习,读者可以掌握C语言算术、自增自减、赋值、逗号运算符,以及相关的表达式的使用。
任务目标
掌握算术、自增自减、赋值、逗号运算符以及表达式。
熟悉算术、自增自减、赋值、逗号运算符的优先级以及结合性。
相关知识
4-1-1 算术运算符与算术表达式
1.算术运算符
算术运算符用于执行程序中的数学运算,C 语言中常用的算术运算符有以下 7种,如下表4-1所示:
表 4-1算数运算符
运算符 |
运算 |
范例 |
结果 |
+ |
正号 |
3; |
3 |
- |
负号 |
b=4;-b; |
-4 |
+ |
加 |
5+5 |
10 |
- |
减 |
6-4 |
2 |
* |
乘 |
3*4 |
12 |
/ |
除 |
5/5 |
1 |
% |
取模(即算术中的求余数) |
7%5 |
2 |
上面的大多数运算我们都比较熟悉,下面仅对除法和去模做些说明。
(1) 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 例如:int x= 10/3 ,结果是 3 。
(2)当对一个数取模时,可以等价 a%b=a-a/b*b , 这样我们可以看到 取模的一个本质 运算。
接下来我们通过一个案例来讲+, - , * , / , %,用法,请看实例4-1所示。
实例4- 1算术运算符的使用
#include <stdio.h>
int main()
{
int a = 8;
int b = 7;
printf("%d与%d的算术运算的结果如下",a,b);
printf("\na-b=%d", a - b);
printf("\na+=b=%d", a + b);
printf("\na*b=%d", a * b);
printf("\na/b=%d", a/ b);
printf("\na%%b=%d", a % b);
getchar();
return 0;
}
运行结果如图4-1所示。
图4- 1实例4-1案例运算结果
上述案例中,分别对变量a与变量b进行了算术运算,注意在格式化打印函数printf中输出%(取模)时,可以连续用两个%,即printf("%%");这个语句会输出一个%。
2.算术表达式
算术表达式是由常量、变量、函数、圆括号、运算符等组成。一个常量、一个变量(已赋过值)、一个函数都是合法的表达式,是表达式的简单情况。例如:a+1、a-b、1*10、20/2、30%4…..等等。
3.算术运算符的优先级
在C 语言中,算术运算同样存在着规则。当算术表达式由多个不同的算术运算符组成时,会按照运算符的优先级进行运算:先乘除后加减、先括号里再括号外,优先级相同,按照自左向右的顺序进行运算,如表4-2所示。
表 4-2算术运算符的优先级
运算符 |
描述 |
优先级 |
结合性 |
* / % |
算术乘除运算 |
3 |
从左向右 |
+ - |
算术加减运算 |
4 |
从左向右 |
例如:
a*10+100%3-b/10。
小括号优先级最高,先计算(100%3)。*与/优先级相同,自左向右运算,先计算 a*10, 再计算 b/10。+与-优先级相同,自左向右运算,先计算加法,再计算减法。
和数学中一样,可以通过小括号()来改变运算优先级,不过 C 语言中只有(),没有[]、{},()可以嵌套多层。a*(10+100%(3-b)/10);
4-1-2 自增与自减运算
1.自增自减运算符
自增运算符是“++”由2 个“+”组成,作用是将变量值增加 1,例如声明int a=2;
变量自增运算就可以这样表示:++a或a++,都表示变量自增1,运算之后的结果a=3。
自减运算符是”--”由2个“-”组成,作用是将变量值减 1,例如声明int a=2;
变量自减运算就可以这样表示:--a或a--,都表示变量自减1,运算之后的结果a=1。
关于自增自减前缀与后缀,后面我们来说差别。
- 自增自减运算表达
自增运算表达式是由自增自减运算符、小括号、操作数连接起来等组成。注意自增自减操作符最终都是要给某个变量赋值,所以自增与自减运算只能用于变量运算,不能是常量、表达式等。例如:以下都是错误写法:
--22 //错误写法,不能是常量
(a+3)++ //错误写法,不能是表达式
3.自增或是自减的前置和后置的异同点。
(1)当自增当做一个独立语言使用时,不管是 ++a; 还是 a++; 都是一样的,等价 ,
接下来我们通过一个案例来讲独立语言使用a++和++a,用法,请看实例4- 2
#include<stdio.h> int main() { int a=1; a++; printf("a=%d\n",a); getchar(); return 0; } 运行结果:2 |
#include<stdio.h> int main() { int a=1; ++a; printf("a=%d\n",a); getchar(); return 0; } 运行结果:2 |
这样,a++和++a 都相当于 a=a+1。如图4-2所示。
图4- 2 自增运算符在独立使用举例
自减在独立使用中和自增的效果一致。
(2)当 自增 当做一个 表达式使用时 如j = ++i 等价 i = i + 1; j = i; 如图4-3所示。
图4- 3 自增运算符前置在表达式中的使用
表达式使用时 如j = i++ 等价 j = i ; i=i++; 如图4-4所示。
图4- 4 自增运算符后置在表达式中的使用
自减在当做一个 表达式使用时与自增的效果一致。
下面再通过一个例子来巩固一下自增运算表达式的使用,请看实例4- 3所示。
#include<stdio.h> int main() { int a=1; printf("%d\n",a++); //后++ printf("a=%d\n",a); getchar(); return 0; } 运行结果: 1 a=2
|
#include<stdio.h> int main() { int a=1; printf("%d\n",++a); //前++ printf("a=%d\n",a); getchar(); return 0; } 运行结果: 2 a=2 |
为了更好的理解现总结自增自减运算符的使用见表4-3所示。
表 4-3自增自减运算符使用举例总结
++ |
自增(前) |
a=2;b=++a; |
a=3;b=3; |
自增自减运算符优先级为2,结合性从右向左
|
++ |
自增(后) |
a=2;b=a++; |
a=3;b=2; |
|
-- |
自减(前) |
a=2;b=--a; |
a=1;b=1; |
|
-- |
自减(后) |
a=2;b=a--; |
a=1;b=2; |
4-1-3 逗号表达符与表达式
1.何为逗号运算符?
C语言提供一种特殊的运算符,逗号”,”运算符,在运算符中优先级别最低。
2.何为逗号表达式?
用逗号将各表达式分割,整个式子称为逗号表达式,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。
例如:表达式1,表达式2,..表达式n
其计算的过程是:先计算机表示1,再计算机表达式2,依次计算最后表达式n的值是整个逗号表达式的值。
例 3+5,6+8 得 14
a=3*5,a*4 60
x=(a=3,6*3) 18 x=18
x=a=3,6*a 18 x=3
注意:不是任何地方出现的逗号都作为逗号运算符
例 函数参数之间使用逗号分割
printf("%d,%d,%d",a,b,c); a,b,c 不是逗号表达式
printf("%d,%d,%d",(a,b,c),b,c); (a,b,c)是逗号表达式
4-1-4 赋值运算符与表达式
1.赋值运算符
在C 语言共提供了 两种形式个赋值运算符,如下:
(1)基本赋值运算符:=。
(2)复合赋值运算符:+=(加赋值)、-=(减赋值)、*=(乘赋值)、/=(除赋值)、%=(求余赋值)。
2.赋值表达式
由赋值运算符将一个变量和一个表达式连接起来的式子,称为赋值表达式。
如 int a=5; 表示把 5 赋值给整型变量 a,不能读成 “a等于5”。赋值号左边必须为左值,赋值号右边的右值可以为常量、变量或表达式。如下赋值均是正确的。
int a,b; //定义整型变量a和b
a=3; //把常量3赋值给a,右值为常量
b=a; //把变量a的值赋给b,右值为变量
b=a+3; //把求和表达式a+3的值赋给b,右值为表达式
复合赋值:+=、-=、*=、/=、%=
a+=b; 等价于 a=a+b;
a-=b; 等价于 a=a-b;
a*=b; 等价于 a=a*b;
a/=b; 等价于 a=a/b;
现将赋值运算的使用总结如下,见表4-3所示。
表 4-3 赋值运算符的使用
运算符 |
运算 |
范例 |
结果 |
= |
赋值 |
a=3;b=2; |
a=3;b=2; |
+= |
加等于 |
a=3;b=2;a+=b; |
a=5;b=2; |
-= |
减等于 |
a=3;b=2;a-=b; |
a=1;b=2; |
*= |
乘等于 |
a=3;b=2;a*=b; |
a=6;b=2; |
/= |
除等于 |
a=3;b=2;a/=b; |
a=1;b=2; |
%= |
模等于 |
a=3;b=2;a%=b; |
a=1;b=2; |
通过下面的例子,掌握上述 4 种复合赋值运算符,如4-4案例所示。
实例4- 4分析以下程序,输出其运行结果。
#include<stdio.h>
int main ()
{
int a=1,b=2,c=3; //定义三个整型变量,并初始化
float d=10.2f; //定义float变量d,用浮点常量10.2初始化
a+=1; //相当于 a=a+1;即 a=1+1=2
b-=a+5;
c*=a-4;
printf ("%d,%d,%d,%f",a,b,c,d/=a);
return 0;
}
运行结果 如图4-5所示。
图4- 5 实例4-4的运行结果
代码分析:
1. float d=10.2f; 如果改为 float d=10.2; 虽然没有语法错误,可以正常运行,但一般编译器会提示 warning(警告),原因是编译器会把 10.2 等常量默认当成 double 型常量处理,与 d 的类型 float 不一致,故出现警告。因此可通过加 f 明确 10.2 为 float 型常量。
2.a+=1; 相当于 a=a+1; 求出 a 为 2。
3.b-=a+5; 由于赋值运算符的优先级低于算术求和运算符,故该语句等价于 b=b-(a+5);,即 b=2-(2+5);,得 b=-5;。同理,c*=a-4; 即 c=3*(2-4);,故 c=-60
4.printf("%d,%d,%d,%f",a,b,c,d/=a); 由于输出列表中 a、b 和 c 均为 int 型变量,故输出格式占位符均为 %d;输出列表中第 4 项为表达式,其表达式的值为 d=d/a=10.2f/2=5.1,为浮点类型,输出格式占位符为 %f,float 类型为小数点后保留 6 位数字。