1,前言
看到顺序二字,大家会想到什么,是不是类似1,2,3…有顺序的,不是乱序的。那么顺序程序设计,也是这么一个道理。顺序的。执行完这行语句之后就是下一行,然后是下下一行,以此类推,直到程序结束。按顺序一行一行都程序。
说到这里,是不是感觉这一章内容就结束了。No!我们现在开始。
2,数据的表现形式及其运算
2.1,常量和变量
这两个量大家都在初中,高中接触过,常量不变的量;变量变化的量。
2.1.1,常量
常量分很多种,我们一一说明。
-
整型常量:通常是整数。1001234、0、-22\
-
实型变量:有两种表现形式
小数(十进制):3.14、1.0、-55.56等等
指数形式:12.34e3(代表:12.34×10^3,3次方)e可以写成E,但是前面可以有数字,后面必须是整型。
-
字符常量:两种形式
普通字符:‘a’、‘Z’、‘3’、’?’,不可以写成’ab’或’12’。用一对单撇号括起来,只能是一个字符。字符常量存放在计算机中并不是存入了一个字符,而是对应的ASCII码,“A’和’a’是不一样的,'A‘的ASCII码是65,而’a’的ASCII码是97。一个标点符号,也会有对应的ASCII码。可以参考一下谭浩强老师的《C程序设计》。重点关注下”A’‘Z’,‘a’'z’这两部分
这部分内容网络上有很多。不在叙述。或者后后期补充
-
转义字符、
这是一种特殊的字符变量,
这部分内容网络上有很多。不在叙述。或者后后期补充
-
字符串常量:“boy”、“123”、“您好”等等。注意这里是双撇号,单撇号可以括一个字符,而双撇号可以括多个字符。
-
符号常量:用
#define
指令,指定一个符号名称成为一个常量。这个考试遇到了,幸好我在考试之前遇到过,但不知道具体有什么用。说到这个了我们就看看这个有什么用叭
#define p1 3.14
这里好像不应该用定义描述,指定。指定后所有的p1都代表3.14。这样做有什么好处呢?含义清晰。可以知道p1就是圆周率,3.14嘛。好修改,这个在这好多地方都用到了p1,“一改全改”,我们看一下
2.1.2变量
这个字面意思,可以变得量
之前提过C语言是静态语言。因此在使用时需要确定他变量的数据类型。所以时刻记住一句话,先定义,后使用。怎么定义一个变量呢?[数据类型] [变量名] [变量值]
由三部分或者两部分组成,因为变量值可以是从键盘输入获取。
int a=1;
float c;
char s;
int a, b, c=1;
可以一次定义一个变量,也可以是一次定义多个变量。
2.1.3,标识符
什么是标识符呢,还有变量名好像也没有说清楚。说白了就是命名。为变量、数组、函数等等命名,这个命名我们就称为标识符。
命名是有规则的,我们来看看,
标识符只能用数字、字母和下划线组成,第一个字符必须是数字。大小写敏感。
不可以用C语言关键做标识符。
2.3,数据类型
变量的命名方式是什么?我们在回顾一下。
[数据类型] [变量名] [变量值]
会有人问一下数据类型是什么?好部分可能有点长,我们一起看看。
先说一下为什么C语言会提出这一概念,而仅是C语言在Java、python中这一点也可以看出来。
在计算机中,数据是存放在存储单元中的,它是具体存在的,而且,存储单元是由有限的字节构成的,每一个存储单元存放数据的范围是有限的,不可能存放“无穷的”的数,也不能存放循环小数。
这是书上的原话,还有一个例子
>>> printf("%f",1.0/3.0);
0.333333
在数学中,1/3=0.33333333333333
树上的意思是说每一个数据都有一个内存空间(我们就说他为杯子吧)数据就是水咯。哈哈哈,就说多大的杯子装多大的水。其实还有个问题,我们后面再说。
所谓类型,就是对数据分配存储单元的安排。包括;存储单元的长度(占多少字节)以及数据的存储形式,不同的类型分配不同的长度和存储形式。
这就是我要说的问题,杯子是怎么分配的,在日常生活中杯子里可以说半杯水。但是在计算机中这里是很严格的,不可以有空余,必须是刚刚好。
2.3.1,整数类型
对于我已经学完了这一章的内容,因我们用到的数据长度不一样,所以会把整数类型分有基本整型、长整型、短整型等等,不光是整数型,浮点型也是这样,因为这里我学的不是很清楚,所以我会重新整理一遍。一起看看。
- 基本型:类型说明符为int,在内存中占2个字节。范围-32768至32767
- 短整型:类型说明符为short int或short。所占字节和取值范围均与基本型相同。
- 长整型:类型说明符为long int或long,在内存中占4个字节。
- 无符号型:类型说明符为unsigned,只存储数值,不存储符号。
以下是整数类型的四种,有没有人会和我一样有同一个疑问,他们是怎么用的,我只?知道他们表示数据的范围不一样。
2.3.2,字符型数据
字符数据是按字符的形式存储吗?答案是不是,按整数形式存储。
-
字符与字符代码
不是说随便一个字符或者字符代码程序就可以识别,而是按照系统的字符集的,且大多数采用ASCII码字符集。包括大小写英文字母、数字,专门符号等等。
-
字符变量
类型说明符为
char
char c='?';
这里看似给c赋了一个字符变量。其实是整数63,
?
的ASCII是63。在上面提到过,
2.3.3,实型数据(浮点数)
- 单精度 float 6~7为位效数字 分配4个字符
- 双精度 double 15~16位有效数字 分配8个字符
3,运算符和表达式
看到这里我想大家可以猜到这一部分的内容吧,应该是要将加减乘除和式子的事情,毕竟只要写程序,就要有数据参与运算。是不是想跳过这一部分,然后他除了我们传统知道的运算符之外还有很多,他们的优先级也是不一样的。但是说到表达式我的个人感觉是和之前学过的式子是一样的,我们一起来看看
3.1,运算符
运算符 | 含义 |
---|---|
算术运算符 | (+ - * / % ++ – ) |
关系运算符 | (> < == >= >== !=) |
逻辑运算符 | (! && ||) |
位运算符 | (<< >> ~ | ^ &) |
赋值运算符 | (=及其扩展赋值运算法) |
条件运算符 | (?:) |
逗号运算符 | (,) |
指针运算符 | (* &) |
求字节数运算符 | (sizeof) |
强制类型转换运算符 | ((类型)) |
成员运算符 | (, - >) |
下标运算符 | ([]) |
其他 | (如函数调用运算符()) |
3.2,算术运算符
运算符 | 含义 | 举例 | 结果 |
---|---|---|---|
+ | 正号运算符(单目运算符) | +a | a的值 |
- | 负号运算符(单目运算符) | -a | a的算输负值 |
* | 乘法运算符 | a*b | a和b的乘积 |
/ | 除法运算符 | a/b | a除以b的商 |
% | 取余运算符 | a%b | a除以b的余数 |
+ | 加法运算符 | a+b | a加b的和 |
- | 减法运算符 | a-b | a减b的差 |
3.3,自增自减运算符
什么意思呢?自增:++;自减就是:–,他们的作用就是变量自身加1或者减1.
但是呢这个又会分出两种情况:i++、i–或者++i、–i;你们说他们有什么不同呢,从形式上可以看出来的是变量位置不一样,因此他们的运算顺序也不一样。
-
i++、i–
先运算、后自增。
这个应该怎么理解呢,可以分成两步,
a=i++
等价于a=i
(运算)i+1
(自增)那么顺着这个思路,i–呢?
i--
则a=1
i=0
-
i++、i–
反而这个呢?先自增,后运算,刚好与上面的那个反的。
那么
a=i++
等价于i=i+i
(自增);a=i
(运算),
3.4,优先级与结合体
这个是怎么意思呢,就和以前数学学过的一样,运算规律,先算乘除后加减,有括号先算括号。
然而我们也看到了C语言的运算符多了,
这部分内容这一个大表格,网上也有相关内容。这部分用的不多吧,他也经常用。如果是说有考试,那么他就会在这里出题。
3.5,不同类型从混合运算
编写程序那必然少不了数据之间的运算。如果是同类型之间的运算,那还简单,类型一样。比如1+5=6
、1000-100=900
但是呢你说这个怎么办10+3.14=?
你会说这个很简单啊,答案是13.14。但是呢,我感觉我这个举例不好,这个呢,
100+A+3.14=?
这个怎么算呢,有整数、字符、分数。会说这个合法吗
嘿嘿,合法。
这个我的理解像是数学中的单位转换,1cm和1dm,1kg和1g这个如果做加法或者减法必须是单位统一,而在C语言中类型统一,同时类型还必须是高类型。这个之前我看过一个特别好的例子,500ML的杯子装不下1L的水,但是1L的杯子可以装下500ML的水
我们把A
转换一下就是65,式子变成`100+65+3.14=168.14,
我们看一下下面的那张图,这就是他们的转换规则。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FtNKZ1Hm-1642045162509)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220108161347205.png)]
要是这么讲100+65+3.14=168.14
,还会变成 100.000000+65.000000+3.140000=168.140000
,保留两位小数168.14
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lSMsU64U-1642045162510)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220110155352934.png)]
顺着箭头可以看到double是大哥啊
3.6,强制类型转换
-
一般形式(类型名)(表达式)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KWqYlf3Y-1642045162510)(https://cdn.jsdelivr.net/gh/yanghuanh1314/MyPicture@master/image.258n0z5x3gkg.webp)]这是两个能经常用到的叭,但是我们注意一下当浮点数转换整数时并不会四舍五入,而是直接取整数部分。
4,C语句
4.1,C语句的作用和分五种,我们来看看
-
条件语句
语句 介绍 if()…else… 条件语句 for()… 循环语句 while()… 循环语句 do…while()… 循环语句 continue 结束本次循环语句 break 终止本次switch或者循环语句 switch 多分支选择语句 return 从函数返回语句 goto 转向语句,在结构化程序中基本不用 -
函数调用语句
用函数调用与分号构成。
printf("hello world");
-
表达式语句
一个表达式加一个分号组成。
20/2%3;
-
复合语句
由多条表达式构成,一组大括号
{}
括住。这个也不很难理解,我们也还没有遇到。常用于循环、条件语句中。for(int i=0;i<2;i++){ for(int j=0;j<3;j++){ scanf("%d",&a[i][j]); } printf("\n"); }
有个大括号。
-
空语句
;
一个分号。有什么作用呢,程序结构清晰,我一般喜欢这一部分介绍后空格,进行下一部分。
4.2,最基本的语句——赋值语句
4.2.1,赋值运算符(=)
这就是一个等于号,看着很简单,也很简单。但是在程序设计中很常用,不仅是C。
4.2.2,复合运算符
在赋值符之前加上其他运算符。类似+=
、-=
、*=
…
什么含义呢
a+=1
等价于a=a+1
a-=1
等价于a=a+1
a*=1
等价于`a=a*1
…
这个经长常用到。也很容易记忆。
4.2.3,赋值表达式
之前介绍过什么是表达式,但是什么是赋值表达式呢
赋值表达式的一边形式
变量 赋值运算符 表达式
a = 3*5;
把3*5
的值赋给a
,a
=15
4.2.4,赋值过程中的类型转换
这部分好像之前我已经说了一堆,我在说一遍
1,浮点数赋值整数类型
舍取小数部分,
2,整数类型赋值浮点数
书里面写了很多,其实就是往后面加0
3,双精度赋值单精度
取6~7位小数
4,字符型赋给整数型
这个事和我我们之前提过的ASCII码有关,他返回对应的ASCII码
4.2.5,赋值表达式与赋值语句
什么是赋值表达式?变量=表达式:
什么是赋值语句,就是说表达式里面有一个或多个赋值表达式
变量=(变量=表达式)
其展开形式变量=变量=.....=表达式
举个栗子
a=b=c=d=10/3
4.2.6,变量赋初值
这个很简单
int i=1;
6,数据的输入输出
在我的举例中大家也看到了我经常用到的一个函数printf()
这是一个输入函数,print的中文也是打印的意思。在python中输出函数直接是print()
直到现在,我也经常把printf写成print。
6.1,输出输入相关概念
- 从计算机输出设备输出的数据叫输出,从计算机输入设备输入的数据叫输入
- C语言不提供输出输入函数。那么会问这是怎么来的。是由C语言的标准函数库提供的。
- 在程序文件的开头使用
#include
把有关头文件引入进来。在之前也说过头文件的重要性。
6.2,printf()使用
一般形式
printf(格式控制,输出数列)
会看到由两部分组成,
-
格式控制:一般用双撇号括起来的一个字符串。格式控制字符串。里面还包含了两部分信息
- 格式声明,由
%
和格式字符
组成。像之前提到过的%d
和%f
。还有很多 - 普通字符:普通字符在输出的时候会原样输出。、
- 格式声明,由
-
输出数列:需要输出的数据
printf("%d,%d\n",a,b);
值得注意的是,格式声明应与输出数列的数据一一对应。在python特意提出了这是槽,槽与数据对于。
格式字符
之前提到了%d
、%f
那么这些是什么吗意思呢,会不会还有很多。
%d
输出一个十进制数字。可以理解为用这个输出整数。也可以在指定域宽(所占的数列)。
>>> printf("%5d",a);
10 // 就是说占用了5个字符。
%c
用来输出有一个字符。也可以指定域宽。
你说如果字符变量是一个整数呢,会输出什么。规定如果整数在1~127范围之间,系统会识别成ASCII码,输出对应的字符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MEK2MLc2-1642045162512)(https://cdn.jsdelivr.net/gh/yanghuanh1314/MyPicture@master/image.4t9m1mle5l60.webp)]
s%
输出一个字符串。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-85lvGOOW-1642045162512)(https://cdn.jsdelivr.net/gh/yanghuanh1314/MyPicture@master/image.cw9v15wh8hs.webp)]
%f
用来输出实数,可以说单精度。双精度、长双精度。
基本型用%f
。但是如果不指定长度,则整数部分全部输出,小数部分输出6位。
小数部分不够6位用0补充,够6位了根据第7位四舍五入。和上面提到的不一样。
如果说保留两位小数呢?可以用到%m.nf
什么意思呢
7.2%f
这个数占7列,保留两位小数。因此可知m
表域宽n
表小数位数
类似这样,我们多半不用域宽写成%.2f
即可。
数据左对齐,%-m.nf
可以说加个杠。
目前经常用到的应该就是%d
和%f
格式字符还有很多,我在这不一一说明了。
6.3,scanf()
的使用
可以从输入设备输入数据
一般形式
scanf(格式控制,列表地址)
scanf("%d",&a);
格式控制是和printf()
中的格式控制一致。出现了一个新的名词,列表地址。
列表地址是由多个地址组成,可以是变量地址,也可以是字符串首地址。
注意事项
-
上面说过格式控制,当我们需要输入什么类型的数据,就用什么。常用的有三个
%d
输入整数数据、%f
输入浮点数数据、%c
输入字符数据。 -
介绍一个符号
&
取地址符,什么是取地址符呢。我也不是很清楚。这个我们在指针部分继续研究 -
如果是输入多个变量呢,可以这样。
scanf("%d%f%c",&a,&f,&c)
scanf("%d%f%c",&a,&f,&c)
一次性可以输入多个数据,但是要注意地址列表里的数据应与格式控制里的内容一一对应。
其次是输入数据也是有规律的,。
scanf("%d%d%d",&a,&b,&c);
可以输入成1 2 3 注意用空格隔开
scanf("%d%f%c",&a,&f,&c)
可以输入成1,2,3 注意用
,
隔开所以看格式控制中是怎么指示的,数据就怎么输入。
6.4,字符输出输入函数
putchar()
输出一个字符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FCj5ghy1-1642045162513)(https://cdn.jsdelivr.net/gh/yanghuanh1314/MyPicture@master/image.dz9kc212s3c.webp)]
如果定义3个整型变量呢?
之前也是提到过这个问题,输出对应的ASCII码。
getchar()
输入一个字符
是需要连续输入三个字符,用输入getchar()
输入进去,之后在用putchar()
打印出来。
如果不是连续输入三个字符。输入一个字符,我就enter回车。系统会这样处理 。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wflkzelc-1642045162514)(https://cdn.jsdelivr.net/gh/yanghuanh1314/MyPicture@master/image.34n24sejhv20.webp)]
开始我以为是我我的问题。我们看看是怎么回事。、
我发现了一个事,连续输入三个字符输出时没有换行,而我输入一个字符后回车输入,而输出时换行了。
其实我们还是输入了三个字符。转义字符也是字符的一种。好我就直接说了。
我们输入b后回车看着输入了一个字符,其实是两个字符,把b赋值给了a,紧接着回车就是换行符赋值给了b,输入o再回车,我们规定了只能输输入三个字符,所以就,是不是有点乱。可以说我们输入了三个字符b
\n
o
所以就。
也说明了一件事:在输入信息时,不是说一个回车就可以把数据送计算机中。而是先暂存在缓冲区,之后按下enter后将这些字符全部送到计算机中个字符。转义字符也是字符的一种。好我就直接说了。
我们输入b后回车看着输入了一个字符,其实是两个字符,把b赋值给了a,紧接着回车就是换行符赋值给了b,输入o再回车,我们规定了只能输输入三个字符,所以就,是不是有点乱。可以说我们输入了三个字符b
\n
o
所以就。
也说明了一件事:在输入信息时,不是说一个回车就可以把数据送计算机中。而是先暂存在缓冲区,之后按下enter后将这些字符全部送到计算机中
7,总结
这部分内容比较多,到这里也就结束了。
文中比较难以理解的就是字节了。我现在还是不清楚4个字节,8个字节是什么意思。
刚刚由搜了一下。说是内存条出来数据是二进制,一个二进制数是由八位数构成(0和1)。内存的最小单位是位(bit),存储容量的基本单位是字节(byte,简称b)。现在是这样的,1B=8Bit。但是感觉我还是说不清楚。
这部分内容看起来比较多,很难学,但是在我们编写程序的过程中一般就喜欢用int
float
char
其对应整数、实数、字符。咱就说小程序。编写软件的话我不知道。初学者。
好了,到这里就结束了。如果有错误的地方请指正,因为我也是正在学习,如果我帮到了您,是我的荣幸。
谢谢大家。