内容正文:
专题三 运算符、表达式和语句(讲义)
---《编程语言基础—C语言》专题复习讲练测
[考纲要求]
1:理解运算符、表达式、语句及常用函数的用法。
[课时安排]
2课时
[知识梳理]
一:运算符
在C语言中,C语言用运算符表示算术运算。
算术运算符如下图所示:
运算符
运算
优先级
例子
()
圆括号
1
4+(2*3)
*
乘法
3
6*5
/
除法
3
16/2
%
模除
3
7%4
+
加法
4
3+9
-
减法
4
8-5
①()运算符
C语言中的括号运算符用于改变表达式的求值顺序,确保括号内的表达式优先计算。括号运算符本身没有特定的操作数,它的作用是改变表达式的计算顺序,使得括号内的表达式先于其他部分进行计算。
int a = 5, b = 10, c = 15;
int result = (a + b) * c;
在这个例子中,(a + b) * c 表达式中的括号确保 a + b 先被计算,然后结果乘以 c。
括号运算符通常用于以下情况:
· 明确表达式的计算顺序,避免由于运算符优先级导致的歧义。
· 当需要对多个表达式进行逻辑分组时。
· 在函数调用中,用于明确参数的顺序。
括号运算符本身不改变表达式的结果,只改变计算顺序。
② * 运算符
在C语言中,乘法运算符 * 用于执行两个数值类型的操作数之间的乘法运算。
运算结果 = 操作数1 * 操作数2;
其中运算结果是乘法运算的结果,操作数1 和 操作数2 是参与乘法运算的两个操作数,它们可以是整数、浮点数或任何数值类型的表达式。
int a = 3, b = 15, result1;
float c = 1.5, d = 4.0, result2;
// 整数乘法
result1 = a * b; // result1 的值将是 45
// 浮点数乘法
result2 = c * d; // result2 的值将是 6.0
注意:乘法运算符可以用于相同类型的操作数,也可以将整数与浮点数相乘。如果操作数类型不同,整数操作数将被隐式转换为浮点数,然后执行乘法运算。
C语言提供了乘法赋值运算符 *=,它将乘法运算的结果直接赋值给左侧的操作数。
int x = 5;
x *= 4; // 等同于 x = x * 4,x 的值现在是 20
在表达式中,乘法运算符的优先级高于加法和减法,因此在没有括号的情况下,乘法运算会先于加减运算执行。
int e = 2, f = 3, g = 4, h;
h = e + f * g; // 首先计算 f * g,然后 e + 结果
// h 的值将是 14 (2 + (3 * 4))
③ / 运算符
C语言中的除法运算符用于执行两个数值类型的操作数之间的除法运算。
运算结果 = 操作数1 / 操作数2;
其中 运算结果 是除法运算的结果,操作数1 是被除数,操作数2 是除数。
· 整数除法:
如果两个操作数都是整数类型(例如 int 或 long),结果将是整数,并且是向下取整的结果。这意味着小数部分将被丢弃。
int result = 7 / 3; // result 的值将是 2
在这个例子中,7 / 3 的实际结果是 2.333...,但整数除法只保留整数部分 2。
· 浮点除法:
如果至少有一个操作数是浮点类型(例如 float 或 double),结果将是浮点数,并且会包含小数部分。
double result = 7.0 / 3; // result 的值将是 2.333...
检查除数是否为零,并在必要时采取措施避免这种情况。
C语言还提供了一个复合赋值运算符 /=,它结合了除法和赋值操作。
int num = 20;
num /= 4; // 等同于 num = num / 4,num 的值现在是 5
在混合类型的除法运算中,较小范围的数据类型(如 int)可能会被隐式转换为较大范围的数据类型(如 double),以避免精度损失。
③ %运算符
C语言中的 % 运算符被称为取模运算符或求余运算符。它用于计算两个整数相除后的余数。
运算结果 = 操作数1 % 操作数2;
其中,操作数1是被除数,操作数2是除数,运算结果是取模运算的结果,即操作数1除以操作数2后得到的余数。
使用%运算符时,需要注意以下几点:
· 操作数必须均是整数类型,不能用于浮点数。
· 除数不能为0,否则会导致运行时错误。
示例:
#include <stdio.h>
int main() {
int a = 10;
int b = 3;
int c = a % b;
printf("%d取余%d的结果为 %d
", a, b, c);
return 0;
}
示例中,10 % 3的结果是1,因为10除以3的商是3,余数是1。
④ +运算符
C语言中,+运算符用于执行加法运算。用来将两个数值相加。
int a = 5;
int b = 10;
int c = a + b; // c 的值为 15
+=是+的复合赋值版本,用于将右侧表达式的值加到左侧变量上,并将结果赋值给左侧变量。
int x = 10;
x += 5; // 等同于 x = x + 5; x 的新值为 15
⑤ -运算符
C语言中的-运算符用于两个数值类型的变量或常量之间进行减法运算。
int a = 10;
int b = 5;
int c = a - b; // c 的值为 5
-=是-的复合赋值版本,用于从左侧变量减去右侧表达式的值,并将结果赋值给左侧变量。
int x = 10;
x -= 3; // 等同于 x = x - 3; x 的新值为 7
自增、自减运算符
C语言中的自增(++)和自减(--)运算符是单目运算符,用于递增或递减变量的值。它们有两种形式:后缀形式和前缀形式。
· 自增运算符(++)
后缀形式:使用在变量之后,先返回变量的原始值,然后变量值增加1。
int a = 5;
int b = a++; // a 现在是 6,b 是 5(原始值)
前缀形式:使用在变量之前,先将变量值增加1,然后返回新值。
int a = 5;
int b = ++a; // a 现在是 6,b 是 6(新值)
· 自减运算符(--)
后缀形式:使用在变量之后,先返回变量的原始值,然后变量值减少1。
int a = 5;
int b = a--; // a 现在是 4,b 是 5(原始值)
前缀形式:使用在变量之前,先将变量值减少1,然后返回新值。
int a = 5;
int b = --a; // a 现在是 4,b 是 4(新值)
在复杂的表达式中使用自增或自减运算符时,需要考虑后缀和前缀形式对表达式结果的影响。
1. #include <stdio.h>
2.
3. int main() {
4. int x = 0;
5. int y = ++x; // 前缀形式,x 先增加到 1,然后赋值给 y
6. printf("x = %d, y = %d
", x, y); // 输出 x = 1, y = 1
7.
8. x = 0;
9. y = x++; // 后缀形式,x 先赋值给 y,然后 x 增加到 1
10. printf("x = %d, y = %d
", x, y); // 输出 x = 1, y = 0
11.
12. x = 5;
13. y = x--; // 后缀形式,x 先赋值给 y,然后 x 减少到 4
14. printf("x = %d, y = %d
", x, y); // 输出 x = 4, y = 5
15.
16. x = 5;
17. y = --x; // 前缀形式,x 先减少到 4,然后赋值给 y
18. printf("x = %d, y = %d
", x, y); // 输出 x = 4, y = 4
19.
20. return 0;
21. }
赋值运算符
C语言中的赋值运算符用于将一个值赋给一个变量,将右侧表达式的值赋给左侧变量。
int a;
a = 10; // 将10赋值给变量a
赋值运算符的左侧必须是变量。
赋值运算符的右侧可以是任何表达式,但结果必须与左侧变量的类型兼容或可以隐式转换。
逗号运算符
在C语言中,逗号运算符(,)用于顺序执行两个或多个表达式,并返回最后一个表达式的结果。逗号运算符的一般形式如下:
表达式1, 表达式2, ..., 表达式N;
表达式1到表达式N是按顺序执行的表达式。逗号运算符的结果是最后一个表达式的值。
1. #include <stdio.h>
2.
3. int main() {
4. int a = 1, b = 2, c;
5.
6. // 使用逗号运算符更新a和b的值
7. c = (a++, b++); // 首先执行 a++,然后执行 b++,最后 c 被赋值为 b 的新值,即 3
8. printf("a = %d, b = %d, c = %d
", a, b, c); // 输出 a = 2, b = 3, c = 3
9.
10. return 0;
11. }
逗号运算符的左侧表达式是为了执行它们的效果,通常是为了更新变量的值,而它们的值不会被使用。逗号运算符的执行顺序是从左到右。
位运算符
C语言提供了一组位运算符,用于对整数的二进制位进行操作。
运算符
符号
描述
示例
结果(假设变量a = 5,b = 13,二进制表示分别为0101和1101)
按位与
&
对应位都为1时,结果位为1
a & b
0101 & 1101 = 0101 (5)
按位或
|
对应位至少有一个为1时,结果位为1
a|b
0101|1101 = 1101(13)
按位异或
^
对应位不同为1,相同为0
a ^ b
0101 ^ 1101 = 1000 (8)
按位取反
~
反转每一位,1变0,0变1
~a
~0101 = 1010 (-6,假设int为4位,带符号)
左移
<<
所有位向左移动,左边填充0
a << 2
0101 << 2 = 101000 (20)
右移
>>
所有位向右移动,右边填充符号位或0(取决于编译器)
b >> 1
1101 >> 1 = 0110 (6)
位运算符通常作用于整数类型(如int、char等)。位运算符对浮点数无效。
优先级和求值顺序
在C语言中,运算符优先级决定了表达式中各个运算符的计算顺序。不同运算符有不同的优先级。例如,乘法和除法的优先级高于加法和减法。
括号可以改变运算符的优先级,使得括号内的表达式优先计算。使用括号可以明确表达式的计算顺序。
考虑表达式 a + b * c。由于乘法的优先级高于加法,所以 b * c 会先计算,然后再与 a 相加。
如果要改变计算顺序,可以使用括号:(a + b) * c。这样,a + b 会先计算,结果再与 c 相乘。
在C语言中,结合性决定了当一个表达式中存在多个相同优先级的运算符时,这些运算符是如何被组合的。结合性有两种类型:左结合性和右结合性。
· 左结合性
当运算符具有左结合性时,表达式中的运算会从左到右进行。这意味着在没有括号改变计算顺序的情况下,左边的运算会先于右边的运算执行。大多数运算符都具有左结合性。
int result = 5 + 3 * 2; // 加法和乘法都具有左结合性,但优先级不相同。因此先计算 3 * 2,然后结果加上 5
乘法先执行(因为乘法优先级高于加法),得到 5 + (3 * 2),然后计算结果为 5 + 6,最后结果是 11。
· 右结合性
当运算符具有右结合性时,表达式中的运算会从右到左进行。
int x = 5;
int y = x = 10; // 赋值运算符具有右结合性
表达式和语句
C的基本程序步骤由语句组成,而大多数语句都由表达式构成。表达式由运算符和运算对象组成。例如:
5
-6
4+3
a*(b + j/i)/10
k = 5*2
x = ++c % 3
d > 3
运算对象可以是常量、变量或二者的组合。每个表达式都有一个值。
语句是C程序的基本构建块。一条语句相当于一条完整的计算机指令。在C中,大部分语句都以分号结尾。最简单的语句是空语句。例如:
1. legs = 4;
2. ; //空语句
复合语句(块)
复合语句是用花括号括起来的一条或多条语句,复合语句也称为块。整个复合语句被视为一
条语句,即花括号括起来的一条或多条语句视为一条语句。
{
sum = 9 * a + 5;
printf("sum = %d
", sum);
}
常用的数学函数:
在使用这些数学函数之前,需要包含头文件math.h。
类别
函数名
函数原型
描述
绝对值
fabs
double fabs(double x);
返回x的绝对值
绝对值
abs
int abs(int x);
返回整数x的绝对值
平方根
sqrt
double sqrt(double x);
返回x的平方根
指数
exp
double exp(double x);
返回e的x次幂 (e^x)
自然对数
log
double log(double x);
返回x的自然对数 (以e为底)
十进制对数
log10
double log10(double x);
返回x的以10为底的对数
正弦
sin
double sin(double x);
返回x的正弦值 (x以弧度为单位)
余弦
cos
double cos(double x);
返回x的余弦值 (x以弧度为单位)
正切
tan
double tan(double x);
返回x的正切值 (x以弧度为单位)
xy
pow
double pow(double x,double y)
返回x为底数的y次幂
[真题练讲]
1.(2019高考题)以下程序段的运行结果是( )
int a = 29;
a += a %= 8;
printf("%d
",a);
A.7 B.8
C.10 D.16
【答案】C
【解析】初始值:a = 29按照从右到左的顺序解析表达式:
a %= 8:计算 a 模 8,即 29 % 8 的结果是 5(因为 29 除以 8 的余数是 5)。
a += a %= 8 的结果:此时 a 的值变为 5,然后执行 a += 5,即 5 + 5。
最终计算结果:a = 5 + 5 = 10
2.(2019年高考题)以下程序段的运行结果是( )
char a = 'M',b = 'm';
printf("%c
",(a++,++b));
A.M B.N
C.m D.n
【答案】D
【解析】变量 a 初始化为 'M',变量 b 初始化为 'm'。在表达式 (a++, ++b) 中,a++ 是后缀递增,b 的值先增加,变为 'n'。逗号运算符 , 从左到右求值,但只取最右边的值作为整个表达式的结果。因此,printf 输出的是 ++b 的结果,即 'n'。
3.(2018高考题)若a是int型变量,表达式((a = 3*5,a*2),a++,a+6)的值是( )
A.31 B.37
C.21 D.22
【答案】D
【解析】a = 3 * 5 计算后 a 的值为 15。
a * 2 此时 a 为 15,所以 a * 2 的结果为 30。
a++ 是后缀递增,所以 a 的值在表达式求值后会增加,但在这个表达式中 a++ 的结果仍然是递增前的值 15。a + 6 此时 a 的值是递增后的值,即 16,所以 a + 6 的结果为 22。
4.(2018高考题)若有定义语句float x=5,y= 4.6;,表达式x/2+(int)(x+y)%4的值是( )
A.3 B.3.0
C.3.5 D.4.5
【答案】C
【解析】x 被定义为 float x=5,所以 x 的值是 5.0。y 被定义为 float y=4.6,所以 y 的值是 4.6。x+y 的结果是 5.0 + 4.6 = 9.6。(int)(x+y) 将 9.6 强制转换为整数,结果是 9。(int)(x+y)%4 计算 9 % 4,结果是 1(因为 9 除以 4 的余数是 1)。x/2 的结果是 5.0 / 2 = 2.5。将以上两个结果相加,2.5 + 1 = 3.5。
5.(2018高考题)按要求编写以下C语言程序:
(1)从键盘上输入三个正整数a,b,c。判断能否以这三个数为边构成三角形,若可以则计算三角形的面积且保留两位小数;若不可以则输出“不能构成三角形”。(提示:三角形的面积公式为s=).其中p=(a+b+c)/2;
【答案】
#include <stdio.h>
#include <math.h>
int main() {
int a, b, c;
printf("请输入三个正整数a, b, c,用空格分隔:
");
scanf("%d %d %d", &a, &b, &c);
// 判断是否能构成三角形
if (a + b > c && a + c > b && b + c > a) {
// 计算三角形的半周长
double p = (a + b + c) / 2.0;
// 使用海伦公式计算三角形面积
double area = sqrt(p * (p - a) * (p - b) * (p - c));
// 输出结果,保留两位小数
printf("可以构成三角形,面积为:%.2f
", area);
} else {
printf("不能构成三角形
");
}
return 0;
}
[限时练习]
1.表达式 a*=a+=a=4 的值是( )
A.64 B.32
C.16 D.4
【答案】A
【解析】a=4 首先执行,将变量 a 的值赋为 4。然后执行 a+=a,由于 a 已经是 4,所以 a 增加 4,变为 4 + 4 = 8。最后执行 a*=a,此时 a 的值是 8,所以 a 乘以 8,变为 8 * 8 = 64。
2.假设所有变量均为整型,则表达式(a=5,b=4,b--,a-b)的值是 ( )
A.7 B.8 C.6 D.2
【答案】D
【解析】a=5 将变量 a 赋值为 5。b=4 将变量 b 赋值为 4。b-- 是一个前置递减操作,这意味着 b 的值会先减 1,然后表达式的值是递减前的值。所以 b 变为 3,但表达式的值是 4。a-b 此时 a 是 5,b 是 3(因为已经递减了),所以 a-b 的结果是 5 - 3 = 2。
3.设 int a=8,则执行完语句 a+=a-=a*a 后,a 的值是 ( )
A.64 B.-64 C.128 D.-112
【答案】D
【解析】a*a:计算 a 的平方,因为 a 是 8,所以 a*a 的结果是 8*8=64。a-=a*a:将 a 减去 a*a 的结果。因此,a 从 8 减去 64,变为 8-64=-56。a+=a-=a*a:最后,a 增加 a-=a*a 的结果。所以,a 从 -56 增加 -56,变为 -56-56=-112。
4.下面程序的输出是 ( )
#include<stdio.h>
main()
{int x=036;printf("%d
",++x); }
A.37 B.36 C.31 D.30
【答案】C
【解析】int x = 036; 声明一个整型变量 x 并初始化为八进制数 036,八进制的 036 等于十进制的 30。printf("%d
", ++x); 执行前缀自增 ++x,x 的值增加 1,变为 31,然后 printf 打印 x 的值。因此,修正后的代码输出的结果是 31。
5.以下程序的输出结果是 ( )
#include<stdio.h>
main()
{ int x=10,y=10;
printf("%d %d
",x--,--y); }
A.10 10 B.9 9 C.9 10 D.10 9
【答案】D
【解析】int x=10, y=10; 声明并初始化两个整型变量 x 和 y,它们的初始值都是 10。
printf("%d %d
", x--, --y); 调用 printf 函数,第一个参数 x-- 是后缀递减,所以 x 的值在 printf 调用后会减少 1,但 printf 打印的是 x 递减前的值,即 10。第二个参数 --y 是前缀递减,所以 y 的值在 printf 调用前减少 1,打印的是 y 递减后的值,即 9。
因此,printf 打印的结果是 10 9。
6.a=3; b=++a;执行后,b 值为______,a 值为_______。
【答案】4 4
7.若有定义语句:int a=5;,则表达式:printf(“%d
”,a++)的值是__________。
【答案】5
8.以下语句执行后 a,b,c,d 的值分别为____________________。
a=3;b=5;c=++a*b; d=a++*b;
【答案】5, 5, 20, 20
【归纳小结】
1:C语言运算符是用于执行程序中基本操作的符号,如算术运算符(+、-、*、/)、关系运算符(==、!=、>、<)、逻辑运算符(&&、||、!)等。
2:C语言表达式是由变量、常量和运算符组成的,用于计算并产生一个值或一个结果。
3:C语言语句是程序的基本单位,用于执行程序中的操作,包括赋值语句、条件语句(if)、循环语句(for、while)、函数调用等。
学科网(北京)股份有限公司
$$