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语言的运算符、表达式还有控制结构和语句,在老师的讲解下接触到了很多坑人的知识点,也都在上面列了出来。但是自己在上课的过程中由于对一些细节把控不好,导致了代码反复的调试出错,在画流程图时也有非常多的漏洞,这些短板也需要在日后的学习过程中加强训练,补足短板。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值