C语言之运算符、表达式、控制结构和语句 -----Day11
一.知识点汇总
1.运算符、表达式以及使用方法
1.1运算符的优先级和结合性(自上而下,优先级依次降低)
- 第一级
( ) [ ] -> 自左向右结合
- 第二级——单目运算符
++ * / + - & sizeof 自右向左结合
- 第三级——算数运算符
·+ -
- 第四级——左移和右移
`>> <<
- 第五级——关系运算符
·< 、 <=、 >、 >= 、== 、 !=
- 第七级——位操作运算符
& 优先于 ^
- 第八级——逻辑运算符
|优先于&& 优先于||
- 第九级——条件运算符
?: 自右向左
- 第十级——赋值运算符
= += -=… 自右向左
- 第十一级——逗号表达式
1.2 不同类型数据之间的转换
1.2.1 隐式转换
- 规则1:
char、short自动换成int;int、float自动转成double
- 规则2:
相同类型(除char,short、float)的操作数作算数运算的结果为同一类型
- 规则3
不同类型,先按照级别1进行转;之后如果还有不同类型,则再按低级向高级别转换,各级别的高低如下:
char <short<int<unsigned<long<unsigned long <float<double
1.2.2 强制类型转换
- 一般形式如下
(int)(x+y)
说明:原变量类型不会改变,但是有可能产生精度损失的问题。
1.3 自增自减运算符++ –
- ++(- -同理)
i++ 表示先引用i的值,再加1
++i 表示先自加1,在引用
1.4 赋值运算符
自右向左进行结合
1.5 逻辑运算符
注意:!的优先级大于&&大于||的优先级;!的结合方向为自右向左。
- 逻辑表达式的短路特性
短路特性说明程序在执行的时候并不是每一条语句都运行,而是先判断:如以下例子
1.6条件表达式和逗号表达式
- 条件表达式一般形式:
表达式1?表达式2:表达式3
- 逗号表达式一般形式:
表达式1,表达式2,表达式3…
2.控制结构和语句
2.1 三种基本结构
顺序结构、选择结构、循环结构
2.2选择语句
2.2.1 if语句
//格式一
if(条件)
{
语句段
}
else
{
语句
}
//格式二
if(条件)
{
语句段
}
else if
{
语句段
}
2.2.2 switch语句
switch(表达式)
{
case常量表达式1:语句1;
case常量表达式2:语句1;
.
.
.
case常量表达式n:语句n;
default;
}
2.3 循环语句
2.3.1 while语句
- while语句
while(表达式)
{
循环体语句;
}
- do while语句
do
循环体语句;
while(条件)
{
表达式;
}
特点:至少执行一次循环体,并且可以与while语句互换;
2.3.2 for语句
- 一般形式:
for (表达式1:表达式2:表达式3)
{
循环体语句;
}
2.3.3 break 和 continue语句
- break语句
可以是流程跳出switch循环语句;也可以跳出当前的循环体;
- continue 语句
结束这次循环,接着下一个循环;
二.疑难问题与思考题
1.printf 和 scanf的返回值有什么特点?
printf的返回值是为所匹配的字节数为几,则就返回几;如以下代码
#include<stdio.h>
int main()
{
int ret =123456; //定义一个整数
int a = printf("%d\n",ret);//定义a接受printf的返回值
printf("%d\n",a);//输出为7,其中包含了换行的1个字节
return 0;
}
scanf的返回值为其所能够成功匹配到的字符;
2. 若整数,双目运算符的两边一个是有符号另一是无符号数,该怎么进行转换?
在转换的过程中,第一步要看有符号的数能否表示无符号的数,比如double可以表示unsigned int,则将unsigned转换为double型,如果有符号的数不在无符号的数的表示范围内,则都变成无符号的数,比如unsigned int 和 int ,左后结果表示为unsigned int;
另外还需要注意:unsigned char 和 unsigned short 会首先转换成int型;
3.赋值转换时如何进行短的转换成长的?
是根据该数的二进制的高位是否为1进行转换的:举个例子0x84转换成二进制位1000 0100,其高位为,所以在转换后应该为ffffff84,而0x74转换成二进制位0111 0100,其高位为1,所以转换后直接为74。
4.自增自减的特殊情况
#include<stdio.h>
int main()
{
int x = 1;
int y = 4;
printf("%d %d %d\n",++x,++x,++x);//输出为4 4 4
}
为什么会输出4 4 4呢?原因是,在自加的过程中会使用寄存器的概念,而且在printf输出中是自右向左输出,故x一共自增三次,在++x中使用同一个寄存器,所以最后寄存器中的值为4,所以会输出x的值4;
5.for(; ; );是不是死循环,为什么?
这里的for循环表示是死循环,最后的封号相当于大括号,里面为空语句所以是死循环;同理while(条件);也是死循环;
6.break语句和continue语句的区别?
break语句可以用作于跳出switch语句;或者用于当前循环的跳出,如果是在嵌套的循环语句中,则只跳出当前循环而不是所有循环;而continue语句则是结束当次循环,进行下一次循环,比如在for循环中,本应该输出2的,但是由于continue语句,2没有输出来,而接着循环输出了下一次循环3。
7.int a = 3,4,5;和 int a =(3,4,5);时,a的值为多少?
当执行 int a=3,4,5时,由于=的优先级高于逗号,所以相当于(int a = 3),4,5;所以a为5;而int a = (3,4,5);时由于是自右向左结合,所以a = 5;
三.自我总结
今天主要学习的C语言的运算符、表达式还有控制结构和语句,在老师的讲解下接触到了很多坑人的知识点,也都在上面列了出来。但是自己在上课的过程中由于对一些细节把控不好,导致了代码反复的调试出错,在画流程图时也有非常多的漏洞,这些短板也需要在日后的学习过程中加强训练,补足短板。