基本算数运算
目录
C运算符和表达式
算术运算符和表达式
复合的赋值运算符
增1和减1运算符
宏常量和宏替换
幻数的概念
宏常量
const常量
自动类型转换与强制类型转换运算符
表达式中的自动类型转换
赋值中的自动类型转化
强制类型的转换运算符
常用的标准数学函数
易错:
C运算符和表达式
算术运算符和表达式
1.算数运算符的优先级和结合性
| 运算符 | 含义 | 需要操作的个数 | 优先级 | 结合性 |
| - | 取相反数 | 1个(一元) | 最高 | 从右往左 |
| *,/,% | 乘法,除法,取余 | 2个(二元) | 较低 | 从左往右 |
| +,- | 加法,减法 | 2个(二元) | 最低 | 从左往右 |
2.条件运算符是C中唯一一个三元运算符
3.除法:整数除法和浮点数除法
整数除法:12/5=2(直接舍,不进行四舍五入)
浮点数除法:12.0/5.0(或12.0/5或12/5.0)=2.4
4.求余运算:
(1)求余运算限定参与运算的两个操作数必须为整型,不能对两个实型数据进行求余运算
(2)余数的符号与被除数的符号相同,如11%5=1,11%(-5)=1,(-11)%5 =-1
5.C中没有幂运算符
例题:求某三位数字的三位数字之和
分析:
个位数字:对10求余
百位:对100整除
十位:减去百位数后对10整除
#include
int main()
{int x = 153, b0, b1, b2, sum;b2 = x / 100; //计算百位数字b1 = (x - b2 * 100) / 10;//十位b0 = x % 10;//个位sum = b0 + b1 + b2;printf("b2=%d,b1=%d,b0=%d,sum=%d\n", b2,b1,b0, sum);return 0;
}运行结果:
b2=1,b1=5,b0=3,sum=9
复合的赋值运算符
+=,-=,*=,/=,%=
思考:a=3;
a+=a-=a*a;
a+=a-=a*=a;
二者输出结果为多少?
①a+=a-=a*a; a=3
a+=a-=9; a=3
a+=6; a=-6
a=-12; a=-12
②a+=a-=a*=a; a=3
a+=a-=9; a=9
a+=0; a=0
a=0; a=0
增1和减1运算符
1.操作数为1,且须有“左值性质”,必须是变量,不能是常量或表达式
2.a++(后缀运算符)与++a(前缀运算符)
(1)++a是在变量使用前对其执行加1操作
(2)a++是先使用变量当前值,然后对其加1操作
(3)分别单独执行下面两条语句后,a的值相同
a++;
++a;
思考:n=3;
m=-n++;m,n各为多少?
m=-3,n=4
“++/--”优先级高于其他一元运算符
m=-n++=-(n++) ==> m=-n;n=n+1;(先把-n的值给m,在对n进行加1操作)
思考:为什么上面n++被括起来,却不先计算n++?
n++只表示++的运算对象是n,而不是-n,(-n)++表示++的运算对象是-n,但这是一个不合法操作
(4)后缀运算符优先级高于前缀运算符,前者左结合,后者右结合
(5)增1和减1运算的例子
#include
int main()
{int a = 1;int sum = 0;sum = (++a) + (++a);//先++a操作再进行加法操作,a=3,sum=6printf("%d,%d,%d", a++, ++a, sum);//再分别运算两次return 0;
}运行结果:4,5,6
警告:不要在语句中使用复杂加1或减1表达式(如上),不同编译环境结果不同
宏常量和宏替换
引例:计算圆的周长,在C中不可直接使用π,所以只能输入3.14159,而多次输入太复杂,易出错
幻数的概念
如上例,用到了π,而π在程序中是一个用常数近似表示的,成为幻数
宏常量
建议把幻数定义为宏常量或const常量
#include
#define PI 3.14159 //定义宏常量PI
int main()
{double r;printf("请输入半径:");scanf("%lf", &r);printf("周长:%.2f\n", 2 * PI * r);return 0;
}运行结果:
请输入半径:3
周长:18.85
宏常量也称为符号常量,宏定义的一般形式:#define 标识符 字符串
宏定义中的标识被称为宏名,习惯用字母大写
将程序中出现的宏名替换成字符串的过程称为宏替换
注意:宏定义中的宏名与字符串之间可以有多个空白符,但无需加等号,且字符串后一般不以分号结尾,因为宏定义不是C语言语句,而是一种编译预处理命令
const常量
1.宏定义无数据类型,编译器对宏常量不进行类型检查,只进行简单的字符串替换,若声明某种数据类型的常量,需要用到const常量,只要将const类型修饰符放在类型名之前,即可将类型名后的标识符声明为具有该类型的const常量,因此const常量只能定义时赋初值
#include
int main()
{const double PI = 3.14159;//定义const常量double r;printf("请输入半径:");scanf("%lf", &r);printf("周长:%.2f\n", 2 * PI * r);return 0;
}运行结果:
请输入半径:3
周长:18.85
编译器能对其进行类型检查,某些集成化调试工具可以对const常量进行调试
自动类型转换与强制类型转换运算符
表达式中的自动类型转换
1.C编译器在对操作数进行运算前将所有操作数都转换为取值范围较大的操作数类型,成为类型提升
2.纵向箭头表示必然的转换,即将所有的char和short都提升为int,成为整数提升
float型数据在运算时一律转换为double型,以提高运算精度
特例 :若一个操作数是long型,另一个是unsigned,同时unsigned型操作数的值又不能用long型表示,则两个操作数都转化成unsigned long型
赋值中的自动类型转化
在一个赋值语句中,类型转换的规则是:将右侧表达式的值转换成左侧变量的类型
强制类型的转换运算符
(类型)表达式
#include
int main()
{int m = 5;printf("m/2=%d\n", m/2);printf("(float)m / 2 = % f\n", (float)(m / 2));printf("(float)m/2=%f\n", (float)m / 2);printf("m=%d\n", m);return 0;
}运行结果:
m/2=2
(float)m / 2 = 2.000000
(float)m/2=2.500000
m=5
常用的标准数学函数
#include
求根:sqrt()
求绝对值:abs()
求浮点型绝对值:fabs()
易错:
1.sin x × sin(x) √
2.#define PI = 3.14159 ×
3.(a+b)++ ×,不能对算数表达式进行加1或减1运算
4.int b = 7;float a = 2.5,c = 4.7;
a+(int)(b/3*(int)(a+c)/2)%4=?
2.5+(int)(7/3*7/2)%4=5.5
容易直接将(int)(a+c)/2计算出来,一定要一步一步走,不要跳步
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
