知识点梳理
一、运算符和表达式
1.运算符的优先级和结合性^
2.不同类型数据间的转换
2.1 隐式转换**
2.1.1 什么情况下发生
运算转换----不同类型数据混合运算时
赋值转换----把一个值赋给与其类型不同的变量时
输出转换----输出时转换成指定的输出格式
函数调用转换----实参与形参类型不一致时转换
2.1.2运算转换规则:不同类型数据运算时先自动转换成同一类型。
2.1.3为什么需要类型转换:便于硬件的实现
2.1.4转换规则
规则1:char、short==》int、float==》double
结果类型与转换后的类型相同。
规则2:相同类型(除char、short、float型外)的操作数作算术运算的结果为同一类型。
规则3:不同类型,先按规则1转换,还有不同类型,则再按低级别==》高级别,其结果类型与转换后的类型相同。
ps:各类型的级别高低如下:
char<short≤int≤unsigned≤long≤unsigned long<float<double
2.1.5若整数,双目运算符的两边一个是有符号另一是无符号数。转换规则如下:
首先看,有符号数的类型能否表示无符号数类型的所有取值范围,若可以,则都变成有符号数的类型;否则都变成无符号数的类型。转换的方法和赋值转换的规则相同。
ps:unsigned char 或 unsigned short 都会先转成int
unsigned int +short/char/int == unsigned int
不同类型数据运算结果为范围被包含的一类
3.赋值转换规则
3.1 同类型,有符号和无符号之间赋值
直接把等号左边的内存拷贝到等号右边变量的内存里。
unsigned int a = -3;//a的内存位图和-3的补码位图相同
3.2 长的赋给短的类型
把长的类型的低位,拷贝给短的类型
char ch = 0x1234; // ch获得的是0x34的位图
3.3 短的赋给长的类型
根据短的类型是否为有符号的。若为有符号的,符号位扩展到长类型的宽度,然后赋给长类型。若为无符号的,高字节填0,赋给长类型的。
4.输出转换规则
printf把char、short提升到int型,再传给printf。把float提升到double类型再传给printf。
printf输出时,不区分float和double
5.强制类型转换
一般形式:(类型名)(表达式)
eg: (int)(x+y)
(int)x+y
(double)(3/2)
(int)3.6
ps:强制转换得到所需类型的中间变量,原变量类型不变
较高类型向较低类型转换时可能发生进度损失问题
6.自增自减运算符
作用:使变量值加1或减1
种类:
前缀++i, --i (先执行i+1或i-1,再使用i值)
后缀i++,i-- (先使用i值,再执行i+1或i-1)
ps:
++ – 不能用于常量、表达式和函数返回值,如5++,(a+b)++, getchar()++;
++ --结合方向: 自右向左
前缀运算使用同一寄存器,后缀运算使用不同寄存器。
7.赋值运算
7.1 简单赋值运算
符号:=
格式:变量标识符=表达式
作用:将一个数据(常量或表达式)赋给一个变量
7.2 复合赋值运算
种类:+= -= *= /= %= <<= >>= &= ^= |=
含义: 变量 op= 表达式《= =》 变量 = 变量 op 表达式
eg:a += 3 《= =》 a = a + 3
ps:
结合方向:自右向左
左侧必须是变量,不能是常量或表达式
赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型
赋值表达式的值与变量值相等,且可嵌套
8.关系运算符
种类:< <= == >= > !=
结合方向:自左向右
优先级别:
关系表达式:用关系运算符将两个表达式连接起来的式子。
关系表达式格式:表达式 关系运算符 表达式
关系表达式的值: 1 关系成立,0 关系不成立
ps:应避免对实数作相等或不等的判断
eg: 1.0/3.0*3.0==1.0
9.逻辑运算符
逻辑运算种类: ! && ||
逻辑运算真值表
C语言中,运算量:
0表示“假”
非0表示“真”
运算结果:
0表示“假”
1表示“真”
逻辑表达式的短路特性:
逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符
10.条件表达式和逗号表达式
10.1 条件表达式
一般形式: 表达式1 ? 表达式2 : 表达式3
执行过程
功能:相当于条件语句,但不能取代一般if语句
条件运算符可嵌套
优先级: 13 结合方向:自右向左
表达式1、表达式2、表达式3类型可不同,条件表达式值取较高的类型
10.2 逗号表达式
形式:表达式1,表达式2,…… ,表达式n
结合性:从左向右,先执行完左边的表达式,再执行右边的表达式
逗号表达式的值:等于表达式n的值
二、控制结构和语句
1.if语句(条件选择语句)
1.1 if语句的三种形式
形式一:
格式:if (表达式)
语句
形式二:
格式:if (表达式)
语句1
else
语句2
形式三:
if ( 表达式1 ) 语句1;
else if (表达式2 ) 语句2;
else if (表达式3 ) 语句3;
……
[ else 语句n ]
ps:
if后面的表达式类型任意
语句可以是复合语句
if(x) if(x!=0)
if(!x) if(x==0)
1.2 if语句嵌套
其一般形式可表示如下:
if(表达式)
if语句;
或者为
if(表达式)
if语句;
else
if语句;
在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。
else跟前面据其最近的非else语句配套
2.switch语句
2.1 一般形式
2. 语意 计算表达式的值。并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
ps:
常量表达式,指表达式中不含变量,且值必须互不相同
语句标号作用,必须用break跳出
case后可包含多个可执行语句,且不必加{ }
switch可嵌套
多个case可共用一组执行语句
4.while语句
4.1 一般形式
while(表达式) {
循环体语句;
}
4.2 特点:先判断表达式,后执行循环体
ps:
循环体有可能一次也不执行;
循环体可为任意类型语句;
下列情况,退出while循环
条件表达式不成立(为零)
循环体内遇break,return,goto
无限循环: while(1)
循环体;
4.3 语句说明
while结构是先判别、后执行的循环结构
数据输入可放入while语句中
eg:while(scanf(“%d”,&n),n<=0);
while结构的循环体可以为空语句,即“;”
5.do-while语句
5.1 一般形式
do
循环体语句;
while(表达式);
5.2 特点:先执行循环体,后判断表达式
ps:
至少执行一次循环体
do~while可转化成while结构
6.for 语句
6.1 一般形式
for(循环变量赋初值;循环条件;循环变量增值)
{
循环体语句;
}
6.2 语句说明
表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的表达式
eg:for(sum=0,i=1;i<=100;i++)
eg:for(pro();t=readnum();pro())
表达式2一般是关系表达式或逻辑表达式,可以是其它类型的表达式,只要其值非0,就执行循环体 例:for(i=0;(c=getchar())!=‘\n’;i+=c)
条件检验总是在头部进行的,当开始时条件即为 假,则循环体可能一次也不执行
eg:for(x=10;x<10;–x)
printf("%4d",x);
表达式1、表达式2、表达式3或循环体可以缺省
7.break和continue语句
7.1 break语句的格式、功能
格式:break;
break语句可以使流程跳出switch语句,也可以用来从循环体内跳出循环体
7.2 continue语句
知识点补充
1.printf函数的返回值为输出字符数;
scanf函数的返回值为接收字符数。
2.两整数相除,结果为整数,有一个为实数,则为实数;
%要求两侧均为整型数据。
3.for语句和while语句后加;表示循环体为空,是死循环
学习心得
今天一整天学习下来,课上所讲的知识点基本上能理解了,但是过一会儿或者真正写代码的时候并不一定能想起来,应该还是不够熟练的原因,所以接下来大量的编程训练应该挺有帮助的。还有就是有些题目还是会卡在题目分析也就是画流程图这个步骤,思维不太能发散开,所以还是得去接触各种不同类型的题,巩固自己的解题思维。对于今天的课上内容,在多次自增自减的地方花费了些时间,还有各种表达式的优先级和结合方向现在还不大能记得清,只能一边做题,一边回顾巩固。