文章目录
- 3.3 运算符和表达式
- 3.3.1 C运算符
- 3.3.2 基本的算术运算符
- 3.3.3 自增(++)、自减(--)运算符
- 3.3.4 算术表达式和运算符的优先级与结合性
- 3.3.5 不同类型数据间的混合运算
- 3.3.6 强制类型转换运算符
3.3 运算符和表达式
3.3.1 C运算符
3.3.2 基本的算术运算符
运算符 | 含义 | 举例 | 结果 | 说明 |
---|---|---|---|---|
+ | 正号运算符 | + a | a 的值 | 单目运算符 |
- | 负号运算符 | - a | a 的算术负值 | 单目运算符 |
* | 乘法运算 | a * b | a 和 b 的乘积 | 由于键盘无 × 号,所以用 * 代替 |
/ | 除法运算符 | a / b | a 除以 b 的商 | 由于键盘无 ÷ 号,所以用 / 代替。 两个实数相除的结果是双精度实数; 两个整数相除的结果为整数,如 5/3=1,舍去小数部分。 但是,除数或者被除数有一个为负值,舍入的方向不确定。 |
% | 求余运算符 | a % b | a 除以 b 的余数 | 要求参加运算的运算对象为整数,结果也是整数。如 8%3=2 |
+ | 加法运算符 | a + b | a 和 b 的和 | |
- | 减法运算符 | a - b | a 和 b 的差 |
示例1:
#include <stdio.h>
int main(void)
{int a,b,d;double c;a = 5/3;b = -5/3; c = 5.0/3.0;d = 5%3;printf("5/3=%d\n-5/3=%d\n5.0/3.0=%lf\n5%%3=%d\n",a,b,c,d);return 1;
}
运行结果(你的运行结果可贴在评论区):
3.3.3 自增(++)、自减(–)运算符
- 自增(++)、自减(–)运算符的作用是使变量的值加 1 或减 1。
运算 | 说明 |
---|---|
++i,–i | 在使用 i 之前,先使 i 的值加(减)1 |
i++,i– | 在使用 i 之后,使 i 的值加(减)1 |
示例2:
#include <stdio.h>
int main(void)
{int i,j1,j2;i=3;j1 = ++i; //i的值先变成4,再赋值给j1printf("i=%d,j1=%d\n",i,j1);i=3;//思考一下这里为什么要重新设置为3,如果去掉这一句之后,对下面的计算结果有什么影响?j2 = i++; //先将i的值赋给j2,i的值再变成4printf("i=%d,j2=%d",i,j2);return 1;
}
运行结果:
3.3.4 算术表达式和运算符的优先级与结合性
-
C 算术表达式:用
算术运算符
和括号
将运算对象(也称操作数)
连接起来的、符合 C 语法规则的式子。运算对象包括:常量、变量、函数等。如:a*b/c-1.5+‘a’
-
C 语言规定了运算符的优先级和结合性。
- 在表达式求值时,先按运算符的优先级别顺序执行。
如表达式 a-b*c,由于乘号优先级高于减号,因此要先计算 b*c,再被 a 减。
- 如果在一个运算对象两侧的运算符的优先级别相同,则按规定的“结合方向”处理。
如表达式 a-b+c,由于加号和减号的优先级相同,则按“自左至右”(左结合性)顺序,先计算 a-b,再加 c。
如赋值运算 a=b=c,则按“自右至左”(右结合性)顺序,先将 c 的值赋给 b,再将 b 的值赋给 a。 -
下图表是C列出的所有运算符以及它们的优先级和结合性,供读者参阅。(注意:常用的算术运算符记住自左至右,赋值运算符自右至左,特殊的位运算符和逻辑运算符,图中有标红。不用死记硬背,常用的不用背就会,复杂些的用到时查表即可。)
3.3.5 不同类型数据间的混合运算
如果一个运算符两侧的数据类型不同,则先自动进行类型转换,使二者成为同一种类型,然后进行运算。
-
整型、实型、字符型数据间可以进行混合运算,规律如下:
- (1)+、-、*、/ 运算的两个数中有一个数为 float 或 double 型,结果是 double 型(因为前面也讲过浮点型数据运算的结果是双精度型)。系统将所有的 float 型数据先转换为 double 型,然后再进行运算。
- (2)如果 int 型与 float 或 double 型数据进行运算,先把 int 型 和 float 型转换为 double 型,然后进行运算,结果是 double 型。
- (3)字符(char)型数据与整型数据进行运算,就是把字符的 ASCII 代码与整型数据进行运算。如果字符型数据与实型数据进行运算,则将字符的 ASCII 代码转换成 double 型,再进行运算。
-
以上规则是编译系统自动完成,无需用户干预。
-
分析以下表达式,i 为整型变量,f 为 float 型变量,d 为double 型变量。
示例3:
#include <stdio.h>
/*
功能要求:给定一个大写字母A,要求用小写字母a输出
分析:字符参与运算实则是其ASCII代码参与运算,通过查表可知,A的ASCII是65,a的ASCII代码是97,相差32
*/
int main(void)
{char c1,c2;c1='A'; //将字符'A'的ASCII代码放到c1变量中c2=c1+32; //得到字符'a'的ASCII代码,放在c2变量中printf("%c\n",c2); //输出c2的值,是一个字符printf("%d\n",c2); //输出c2的值,是字符'a'的ASCII代码return 0;
}
运行结果:
3.3.6 强制类型转换运算符
一般形式:(类型名)(表达式)
例如:
- (double)a (将 a 转换成 double 型)
- (float)(5%3) (将 5%3 的值转换成 float)
- (int)(x+y) (将 x+y 的值转换成 int 型)
- (int)x+y (将 x 转换成整型,然后与 y 相加)
- 说明:在强制类型转换时,得到一个所需类型的中间数据,而原来变量的类型未发生变化。
本节完