C语言基础
目录
运算符(只要是运算符进行了运算就会有一个运算的结果,不会改变操作数的值)
进制数
-
计算机常识
-
什么是计算机?
-
能够进行运算的机器就叫做计算机。
-
-
计算机的特点?
-
计算机就是一种电器,只有两种状态,一种通电,一种断电,正因为如此,所以计算机进行运算时,需要很多开关和连接线路来完成,进行一次改动需要很长时间,为了提高效率,能不能把要进行运算的操作和数据存储起来,由冯诺依曼提出了存储程计算机模型-----把操作存储到计算机中。
-
-
计算机如何表示通电和断电状态?
-
用数字0表示断电状态
-
用数字1表示通电状态
-
所以计算机能够识别的指令都是由0和1组成
-
所以计算机存储的数据和操作也都是由0和1组成
-
计算机存储任何内容都只能是通电和断电表示
-
-
计算机数据表示方式
-
1、非移位型数据
-
每个符号就表示对应数据,如:十、二、V、VI
-
-
2、移位型数据
-
每个符号在不同的位置表示的数据大小不同、如:10,100 ,1000
-
-
计算机虽然只有通、断电(即0、1)、可以通过多个通断电状态来表示一个数据值(多个0和1表示,每个0和1在不同的位置表示的数据大小不同)
计算机存储数据进制
-
由于位移型数据特点可以用在计算机中用来表示数据,即位不同表示数据值不同,就是我们所说的进位计数(进制数),是人为定义的带进位的计数方法。
-
计算机中只认识0和1,所以采用二进制
-
-
二进制
-
每一位只有0和1,对应的位不同表示的大小不同(2^n)、逢二进位一
-
-
十进制
-
每一位只有0~9共十个数,逢十进一
-
-
二进制与十进制之间的转换
-
十进制转二进制、把十进制数除以二、最先进行除法的余数作为最低位
-
十进制数35转二进
-
二进制转十进制
-
权值:以进制为底、以当前位数作为幂作为对应位的权值
-
-
八进制
-
每一位只能出现0~7,共八个数据值,逢八进一。进位的一代表低位的八,每一位代表8^n
-
-
八进制转十进制
-
-
- 二进制转八进制
-
-
十六进制
- 每一位数值0~15,但是10,11,12,13,14,15,占用两位,需要用特殊字符来代替(可以使用1位)表示
-
A------------------10
-
B------------------11
-
C------------------12
-
D------------------13
-
E------------------14
-
F------------------15
-
十六进制:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、逢16进一,高位的1代表低位的16,每一位的值应该为16^n
-
十六进制转十进制
-
十进制转十六进制
-
十六进制转二进制
-
二进制转十六进制
-
-
-
C语言简介
-
什么是计算机程序?
-
计算机程序就是为了告诉计算机做某个事情或解决什么问题而设计编写的指令的集合。
只需要让执行程序,计算机就会自动的进行工作,根据程序的内容执行操作。计算机的一切控制都是靠程序进行控制的
计算机只能识别二进制,程序最终的形式是为二进制代码
计算机没做一件事情就是一条指令,一条或者多条指令的集合就是计算机程序。
-
-
计算机语言
-
由于计算机只能识别二进制,需要把我们说的话转换为计算机语言、能够识别的语言(二进制)。如果计算机同时掌握几十门语言甚至上百门语言,只要我们使用任何一门语言计算机都能听得懂(转换为二进制),就可以和计算机交流。
-
计算机语言就是计算机能够识别且能够转换为二进制执行指令的语言,就叫计算机语言。
常见的计算机语言
1.机器语言
2.汇编语言
1.符号化机器语言,用一个符号(单词,数字)来表示一个机器指令
优点:直接产生作用,程序执行效率比较高,可读性稍好
3.高级语言
非常接近自然语言,语法和和结构类似于普通英话
优点:简单、易用、易于理解
缺点:有些改机语言写出的程序执行效率并不高
c语言
C语言是用于和计算机交流的高级语言,就是一种计算机能够识别翻译成计算需要执行的二进制指令
非常接近自然语言,按照人书写的方式进行编写,需要通过翻译变成机器能够识别的机器语言、C语言就是为了方便人进行编写的一种高级语言
程序的执行效率高
C语言版本
-
所有的指令中只有0和1,0表示断电,1表示通电
优点:直接对硬件产生作用,程序的执行效率很高
缺点:指令又多又复杂又难记,可读性差。
-
K&R C(1978年,原始版本)
-
ANSI C(1989年,美国标准协会,对C语言制定了标准,1990年通过了标准、C89、C90)
-
C95(1995年,对C89版本进行了补充)
-
C99(1999年,对C89标准做出了大量的更新,增加了非常多的语言特性,是目前最为流行的版本)
-
C11(2011年,对C语言进行更新,增加了多线程的支持)
-
C17(2017年提出更新,2018年发布,没有任何更新,解决了C11的一些缺陷)
-
C2X
-
-
C语言程序结构
-
对于计算机程序,就是功能指令的集合,如果使用C高级语言写出对应的指令(功能),怎么执行,按照什么顺序执行,从哪里开始执行,c语言都做了规定、要满足C语言的规则
-
对于C语言,实现一些功能后(可以操作计算机完成某些操作),不是随意执行,会有一个执行顺序
-
C语言程序就要规定从哪里开始,执行哪些功能、需要存在程序的执行入口
-
入口:C89
C89 void main()----------入口 { 执行内容,且只执行{}内的内容 顺序执行 } C99 int main()-----------入口 { 执行内容,且只执行{}内的内容 顺序执行 }
-
-
编译器
-
每一门高级语言都有一个针对当前语言的翻译工具,把对应语言的程序(使用对应有语言想让计算机执行的指令集合)翻译成计算机识别的二进制指令
-
C语言程序(用C语言写出的指令集合)的翻译工具就叫做C语言编译器
-
gcc 文件名.c
-
生成a.out文件-----a.out文件就是对应的二进制文件
-
执行程序: ./a.out
-
-
-
结构
-
xxx.c----------C语言指令集合(C语言按照C语言语法类似自然语言的规则写出的执行的功能)
-----------C语言源文件
gcc--------------翻译工具,把C程序翻译为机器语言
a.out----------- 目标程序,可执行程序
-----------------二进制程序
-
C语言基础语法
-
C语言是类似自然语言,要满足一定的语言规则
-
要实现C语言程序(C语言的指令集合),要满足C语言的指令规则(语言规则)
-
基础语法:
-
语句
-
C语言的代码就是一行行的语句构成。语句就是程序的一条操作命令。C语言规定语句(一条操作命令)必须以分号作为结束,除非C语言明确规定可以不写分号
-
-
表达式
-
C语言中各种运算就是使用的表达式。表达式就是一个计算式(进行运算的式子就是表达式),用来获取值(运算的结果)。只要是表达式就有一个运算结果,运算结果出现在运算的位置
-
-
- 语句块
-
C语言允许多条语句形成一个整体,组成一个块,也称为复合语句,通过加上一组{}表示
-
-
空格
-
在C语言中空格不代表任何含义、为了区别各个的不同单位,增强可读性。
-
-
注释
-
注释就是对代码进行解释、说明、只起到提示作用、编译器不会对注释内容进行编译,对代码无任何实质影响
-
单行注释
-
//------从双斜线开始到这一行结束都是注释
-
-
多行注释
-
/* 注释内容 */
-
-
-
数据类型
C语言中,每一种数据都有类型、C语言编译器只有知道数据的类型才有办法操作数据
C语言中支持的基本数据类型有三种
1.整型
2.浮点型
3.字符型
复杂的类型也是基于基本数据类型构成
计算机数据单位
-
bit----------二进制(位)
-
Byte------字节==8bit
-
KB---------千字节==2^10 B(字节)==1024B
-
MB--------兆字节== 2^10KB(千字节)==2^20B
-
GB---------1024MB
-
TB----------1024GB
-
PB----------1024TB
数据类型
在C语言中、每一个数据都给一个固定大小来存储、方便操作
(存取都很方便)
-
整型
整型数据 大小
数据类型 大小 short 2B int 4B long (int) 4B(32位计算机) 8B(64位计算机) long long (int) 8B(64位计算机) 8B(64位计算机)
-
在C语言中支持整数表示、且每个整数类型都是一个固定的大小空间来存储(例如使用32位来存储)
但是有些数据比较大,有些数据比较小,固定大小空间,存比较大的数据时有可能存不下,小的数据空间浪费
在整型中舍弃了多个整数类型,表示不同的固定大小
-
-
浮点型
-
在C语言中支持小数的表示,且每个小数类型也是使用固定大小的空间来存储,数据也会存在大小区别,固定空间大小多少合适?
浮点型 大小 float
4B double 8B 浮点型的数据存储:
整数部分和小数部分分别用二进制表示
-
整数部分表示
-
除以二取余数
-
-
小数部分表示
-
乘以二取整
-
由于小数部分可能出现无限循环,所以在设计浮点型时float 只保留6位小数位
-
由于还是存在小数点,所以把二进制小数,采用指数方式来表示即浮点数的表示分为数据部分与指数部分共同表示
-
数据部分表示小数数据是多少
-
指数部分表示小数点在哪里
-
由于浮点数用二进制表示出来只能固定位数表示,所以在设计浮点型时float精度只有七位
-
浮点型表示小数只能表示一个近似值(由于小数的二进制部分的表示可能不全)
-
由于浮点数用二进制表示出来只能固定位数表示,所以在设计浮点型时float精度只有七位
-
浮点型表示小数只能表示一个近似值(由于小数的二进制部分的表示可能不全)
-
-
-
字符型
-
在计算机中可以存储字符,但是在计算机中可以表示字符,但是字符不能直接存储在计算机中,因为计算机只认识0和1不认识字符
-
设计一种对应管子,泳衣个特殊的数字对应一个字符,在计算机中只需要存储这个数字就相当于存储了字符,在使用时只需要取出这数字然后找到对应关系就是那个字符-------------编码
-
C语言中------------ASCII码
字符类型 大小
char 1B
char 表示的是字符,但是在计算机中存储形式为字符的编码
存储字符就是按照整数存储,这个整数就是这个字符的编码
数据符号
对于数据而言既有正数也有负数,在存储数据时要存储符号
把数据空间的最高位为作为符号位,0表示正数、1表示负数
例如:10 -10
在计算机中所有数据都是以补码形式存储、
原码:
数据值使用二进制方式表示,最高位为符号位为0或者1表示符号如上图所示
正数,符号位为0,后面数值为二进制
负数,符号位为1,后面的数值为对应的正数的二进制的值
反码:
正数 ,反码==原码
负数,除了符号位不变(符号位还是为1)、其他每一位都按位取反(0变为1,1变为0)
补码
正数,补码==原码
负数,反码的基础上+1
在计算机中所有数据都是以补码形式存储、
表示数据类型是有符号(可能是正数也可能是负数)的数据类型,需要在数据类型前加上关键字 signed:
有符号的整型数据:
signed int
有符号的浮点型数据:
signed float
通常不写signed时,编译器也会认为是有符号的数据类型
无符号数据类型(没有符号,数据类型都是正数),没有符号位,类型大小为多少,表示数据位数有多少
表示无符号的类型加上关键字 unsigned:
无符号的整型数据:
unsigned int·
- 练习:
写出以下数据的原码、反码、补码
-13、20、-55、5
写出以下数据的有符号表示、无符号表示
25、-25
-
由计算机的存储的补码、计算出原码:
-
正数(符号位为0)、补码==原码
-
负数(符号位为1)、补码进行取反 再 +1 得到原码
-
-
总结
-
数据基本类型:整型、浮点型、字符型
-
整型:short 、 int、long、long long
-
浮点型:float 、double
-
字符型:char---编码形式表示(一个编码对应一个字符)
-
整型
-
整数,以二进制方式存储、使用除以二取余得到二进制形式(高位补零)
-
浮点型
-
小数,整数部分以除以二取余数表示、小数部分以乘以二取整数表示、得到数据部分
-
小数点的位置,用指数表示
-
由数值部分,和指数部分
-
字符型
-
把所有的字符对应一个编码,把编码(整数)进行存储
-
字符就是以整数形式存储
-
数据有符号(区分正负数)
-
用数据的最高位表示符号位:0表示正数、1表示负数、计算机存储是以补码的形式存储(正数不变,负数取反+1)
-
负数想得到具体的值:把补码进行取反+1
-
表示数据是有符号还是无符号
-
在数据类型前加上signed----表示有符号类型
-
在数据类型前加上unsigned---表示无符号类型(最高位还是数据位、不是符号位)
-
-
变量定义
-
数据:静态数据、动态数据
-
静态数据:指一些永久性的数据、不会改变
-
动态数据:指程序在运行的过程中,可以进行动态的变化(改变)
-
-
常量:表示一些固定的数值,也就是不能改变的数值
-
整型:10、20、浮点型:1.1 、5.2、字符型:'a'、'b'
-
-
变量:表示一些不固定的值、也就是可以改变的数值、需要用一个符号来表示数据、数据不管怎么进行变化、符号都表示这个数据
-
变量可以理解为一段空间的名字,通过变量名就可以得到空间的数据值、就是由于值可能随时发生变化,所以称为变量
-
-
定义变量
-
在程序的空间中申请一个数据类型的空间作为存储对应类型的数据,由于数据的值随时可能产生变化,用一个特殊的符号来表示这个空间(数据存储的空间),用来表示存储的数据值
-
-
形式1:
-
数据类型 变量名字;
-
数据类型:用来存储什么类型数据
-
变量名字:用什么符号来表示这个数据(这个存储空间叫什么名字)
-
不能随便取,要满足一定的规则
-
只能以字母或下划线开始
-
整个名字中,只能出翔,字母数字和下划线
-
下划线:_
-
不能与C语言中规定的关键字一样(如:int)
-
-
每个变量必须有自己的类型,才能知道存储空间的大小,变量名表示存储空间数据的名字。
为什么要定义变量?
为什么要限定类型?
为什么要指定变量名?
-
形式2:
-
数量类型 变量名1,变量名2.变量名3,......;
-
用这种方式来定义多个同一种类型的变量。
-
-
变量使用
-
变量进行了定义,就会有一个对应大小的空间来存储数据
-
变量名就代表存储数据,使用变量名就是使用存储的数据
-
变量存储数据
-
可以利用运算符(=赋值运算符)往变量中存储数据
-
= (赋值运算符) ,把赋值运算符右边的内容赋值给左边
-
变量名 = 值 ;
-
-
注意:变量的要存储的值,应该与变量类型一致
-
变量数据传递
怎么把一个变量数据,存储到另一个变量中
直接把变量的值,赋值给了另一个变量
变量名2 = 变量名1 ;
把变量名1的值赋值给变量名2,让变量名2的值也是变量名1的值
-
-
在定义变量时进行赋值---------初始化
-
数据类型 变量名 = 值 ;
-
-
查看变量值
-
查看(输出)变量值
-
使用printf输出一个或者多个变量值
-
要使用printf这个功能,在文件开始位置添加:#include<stdio.h>
printf("要输出内容(原样输出,(写什么就输出什么),要输出其他内容,需要使用格式化字符来进行表示",);
回车字符 : \n
\ ----------------转义字符,把普通字符变为特殊字符,把特殊字符变为普通字符
-
输入变量
-
给程序的变量输入一个值
-
使用scanf输入一个或多个值给程序的变量
要使用scanf功能,必须在文件前加上:#include<stdio.h>
scanf("人进行输入匹配的内容,在匹配的内容中添加格式化字符,在格式化的字符为u之把匹配的内容给变量",&变量名,&变量名2,&变量名3)
匹配就是把输入的内容和scanf""的内容一次进行匹配看是否一样不一样则认为输入错误,就结束,一样则继续匹配,当遇到格式化字符(%d,%f)则把输入的数据给%d ,%f对应变量
scanf("%d%f",&a,&b);
------>
100 5.4
scanf("a%db%f",&a,&b);
a100b5.4
scanf("a=%d,b=%f"&a,&b)
------->
a=100,b=1.2
一定要完整的匹配,以一种除外,必须加空格区分两个赋值的数值
-
-
运算符(只要是运算符进行了运算就会有一个运算的结果,不会改变操作数的值)
-
算术运算符
-
注意;如果参与运算的数皆为整数,那么运算结果也是整数。
如果参与运算的数中有浮点数,那么结果就一定是浮点数
在求余数本质就是除法求商的余数
在取余运算中的两个数,只能是整数,不能有浮点数。
-
-
数字类型数据的运算(+、 -、 *、 /、 %)
-
/:除法、如果两个是整数相除。得到的结果还是整数
-
%:取余,在进行除法时,不是得到的商,而是得到整除之后的余数
- 比较运算符(关系运算符)
-
练习:输入两个数,用变量存储,交换两个变量的值,把交换后的结果打印出来。
-
-
(> 、<、 == 、>= 、<= 、!=)
-
-
在C语言中用于比较运算,比较两个数(经过 各种运算)是否满足关系,比较判断是否成立、比较运算----------表达式
-
比较运算的结果,要么是成立、要么是不成立、成立结果为1、不成立结果为0,表示真伪
-
注意:如果是多个关系运算符连续使用,则是先把第一个关系运算符进行运算、然后把运算结果与第二个关系运算符进行运算
-
-
注意:浮点数进行比较运算时,都有精度问题,所以避免使用== 来进行浮点数判断相等
-
逻辑运算符
逻辑运算符,提供逻辑判断的功能,用于构造更加复杂的表达式
-
逻辑运算符 作用
&& 逻辑与 运算符,当两侧的表达式都为真时,
整个络及判断表达式为真
|| 逻辑或 运算符,当两侧的表达式至少有一个
表达式为真时,整个逻辑判断表达式为真
! 逻辑非 运算符,改变单个表达式真假,如果
表达式为真,则改为假,如果表达式为假,
则改为真
逻辑运算符运算结果:1或0,1表示真,0表示假
逻辑运算符主要作用就是连接多个运算符,判断是否成立。
在C语言规定中,真:只要非0设置,就表示真 (成立) (1、-1、2、....)
假:只要数值为0,就表示假 (不成立)
浮点数判断相等: a >= b && a< =b
-
位运算符
-
C语言提供位运算符,可以把时间按照二进制位bit 的方式进行运算,用来操作而进制位bit(包括符号位)
位运算符 作用
~ 把一个数据的二进制位按位进行取反
& 位与运算符,把两个数值中的每一位二进制进行
比较,当两个二进制位都为1时,这一位的结果就
为1,否则结果为0
| 位或运算符,把两个数值中的每一位二进制进行
比较,当两个数值的二进制位,只要有一个为1,
(包括两个都为1)这一位的结果就为1否则为0
^ 位异或运算符,把两个数值中的每一位二进制进行比
较,当两个数值的二进制不同时(其中一个为1,另一
个为0),这一位结果就为1,否则为零
<< 左移运算符,把一个数值每一位都左移指定的大小,
低位补零
右移运算符,把数值中每一位都右移指定大小 ,高位
补前面的符号位。
-
-
逗号运算符
-
将多个表达式写在一起,从左至右依次运算每个表达式,同时把最后一个表达式的运算结果作为整个都好运算符的结果
-
-
把a+b作为整个表达式的结果
-
x=1
-
运算的优先级
-
-
如果在表达式中出现多个运算符,则按照优先级进行运算
-
-
复合运算符
在运算符中,可以把运算符结合起来一起使用:
复合赋值运算符
把赋值运算符和其他运算符结合起来一起使用
结合算术运算符:+=、-=、*=、/=、%=
结合位运算符:<<= 、>>=、|=、&=、~=、^=
表示把右边的表达式进行运算得到结果与左边的变量进行运算,然后把结果赋值给左边变量
例如:变量+=表达式;
变量|= 表达式
=========> 变量=变量+(表达式)
自增、自减运算符
-
在程序设计过程中,经常遇到a=a+1 和a=a-1 ======a+=1、a-=1、把a中的变量+1,把a中的变量-1
-
在C语言中提供了两个更为简洁的运算符,即++ 和--
-
符号 作用
++ 自增运算符
-- 自减运算符
变量++ 先在表达式中使用当前变量的值、在当前表达式运
算结束之后把变量+1(先使用变,再把变量+1)
++变量 先把变量+1,然后在表达式中使用改变后的变量值
(先变量+1,然后再使用变量)
在企业进行开发的时候,尽量让++ 、--单独出现,尽量不要和其他运算符结合使用。
避免用法:++a+5
-
流程控制
-
选择结构
-
C语言的程序是顺序执行,即先执行前面的语句,再执行后面的语句
会按照书写的顺序从上往下依次执行程序中的每一行代码。但是这种情况下,不能满足我们执所有指令(程序)执行要求
C语言提供了三种控制程序运行的流程:
三种流程控制结构:
-
C语言中提供了两种选择结构的实现方式:if 和switch
-
顺序结构:
-
选择结构:(根据条件选择执行)
根据对应的一些条件,判断结果,决定是否要执行,不执行则跳过部分语句
-
C语言中提供了两种选择结构的实现方式:if 和switch
-
if选择结构
-
if 单分支选择
-
进行条件判断,满足条件时,执行对应语句
不满足时跳过这段语句继续往下执行。
-
-
-
-
语法形式:
-
if(真假判断的表达式)-------------括号中就是条件只判断真假 { 满足条件的语句块 (如满足条件只执行一条语句,可以不写括号) }
练习:
输入一个数,判断是否在100~200 如果是就打印。
if 双分支选择
进行条件判断,如果满足条件就执行满足条件的语句,如果不满足则跳过满足条件的语句,去执行另一段不满足条件的语句。
if(条件表达式)
{
满足条件语句
}
else
{
不满足条件的语句
}
条件表达式为真(非0),则执行满足条件的语句,为假,则执行不满足条件的语句。
if 多分支选择
进行条件判断,如果满足条件1,则执行条件1的语句·,结束整个if,不满足条件1,则判断条件2,如果满足条件2,则执行条件2的语句,则执行条件2,结束if,如果不满足条件2,则判断是否满足条件3...一直到最后一个条件判断。
语法:
if(条件1)
{
条件1语句
}
else if (条件2)
{
条件2语句
}
else if(条件3)
{
条件3语句
}...
else
{
不满足语句
}
if选择结构的条件表达式特点,只有真假,真就执行,假就不执行。
switch选择结构
switch(表达式)//表达式结果为整数。 { case 常量表达式1://常量表达式记过必须为整数 语句1;通常会在语句结束后加break; case 常量表达式2: 语句2; case 常量表达式3: 语句n; ... case 常量表达式n: 语句n; default: 语句 n+1; }
//计算表达式的值,逐个与其后的case 的常量表达式进行相等判断(等于比较),当表达式的值与常量表达式的值相等时,即执行常量表达式 其后:后的所有语句,当所有case 常量表达式比较都不相等时,执行default:之后的语句。 注意:条件表达式运算结果必须是整型或者字符(因为字符的存储是整数) 常量表达式也必须是整型,且不可变。
-
是一种特殊的if else 结构,对if eslse 进行了补充,提供了多路选择,把if ...else 的多路分支改成更加易用,可读性更好。
-
语法格式:
-
switch case 语句表达式和常量语句表达式结果必须是整数,且当相等后,从case后执行直到遇到break 或整个switch 结束
-
练习:输入一个数用swich 来判断输出是奇数还是偶数。
-
练习:输入一个月份,输出这个月多少天。
-
三木运算符(三元表达式):
条件表达式 ? 语句1 :语句2
如果条件成立(真),则执行语句块1.
否则(条件表达式不成立)执行语句块2
3.循环结构:
-
当给定的条件满足时,反复重复执行对用语句块,直到条件不满足时就会跳过继续往下已知执行。
给定的条件叫循环条件,重复执行的代码成为循环体
-
-
while 循环:
-
语法格式:
-
while (循环控制条件) { 循环体;//需要重复执行的代码 能够让循环结束的语句 }
循环控制条件(循环控制条件为非零就会执行循环,循环完了之后就会再次判断循环条件是否满足...知道某一次判断条件为假就跳出。)
满足条件就会执行,循环退出的主要依据。来控制循环执行的次数。循环什么时候退出
循环体:
循环过程中,需要重复执行的代码。
练习:
先打印五个空格,然后打印五个*;
练习
计算1+2+3+...100的和:
-
for循环
-
判断条件是否成立,成立就执行循环体,再次判断是否成立循环体,不成立就退出循环。
-
for循环语法结构:
for( 初始化表达式;循环条件 ;循环后的操作表达式 )
{
循环体
}
当执行循环,先执行一次初始化表达式(只执行一次),先判断循环条件表达式是否成立,如果条件成立,就执行循环体,循环体执行完会执行寻黄后的操作表达式,再次判断条件表达式是否成立,如果成立,则再次执行循环内表达式,循环体执行完会执行一次操作表达式;继续判断循环条件,当不成立则退出。
-
初始化表达式:用于初始化循环变量,整个循环只会执行一次
-
循环条件表达式:判断表达式,只要为真,就不会断掉重复执行。
-
循环后操作表达式:循环变量的处理表达式,使得每一次循环变量都进行改变,每一轮循环体执行完后执行。
-
注意:与while 循环一致,只是for循环中,把初始值设置和条件变化改变,提供了一个位置让你去添加,再执行时会自动去for 循环的位置进行执行。
-
for 循环括号内的三个表达式可以不写,但是分号必须添加。
-
如果初始化表达式没有添加,说明for循环直接执行条件判断,不需要进行初始化表达式执行
-
如果循环条件表达式没有添加,默认条件永远为真,相当于1
-
如果操作表达式没有添加,每轮循环结束之后不需要额外执行操作。
-
-
循环的嵌套
-
四大跳转语句
-
break
立即跳出当前的switch语句或立即跳出当前循环
2.continue:
用于在循环中,跳过本次循环未执行的语句,直接进行下一次新欢条件判断。
-
-
for循环就算跳过本次内容,也会执行i++
而while循环,则把本次循环的尚未执行的所有内容会跳过
3.
如果没有返回值(void),也可以使用return ;表示结束,但没有值返回。
-
函数
需要重复执行的功能代码,把这个功能单独写出来,然后只需要在需要使用的位置直接指明需要使用这个功能------函数
函数:就是一段可以重复执行的代码,功能:将一个常用的功能封装起来(单独书写变成一个整体),方便以后进行调用。
就是一个功能模块;将一些常用的功能封装起来,(单独写成一个整体),方便以后调用
C语言提供了库函数
也允许我们自己建立函数
函数的定义
返回值类型 函数名(参数列表)
{
函数体;//这个函数功能到底做什么
返回值;
}
函数定义步骤:
-
函数名:(函数较什么名字,这个功能需要有个代号)
-
函数体:这个函数到底是干什么的(具体1功能语句),包含了什么代码
-
返回值类型:就表示函数的功能执行的结果的数据类型
-
返回值:就表示在函数调用完成后,存在一个执行结果,这个值会回到调用位置。
-
-
C语言中只会执行main
-
无返回值,五参数列表函数定义:
-
函数执行之后没有结果,(不需要结果),无返回值
-
没有返回值类型,C语言定义了void 表示空类型,没有数据类型
-
void 函数名(){
{
函数体
}
函数调用:
函数名();
有返回值,无参数列表的函数定义:
函数执行后需要有一个结果,有返回值
函数定义:
返回类型 函数名()
{
函数体;
return+值;//表示函数的结果是 值,值的类型就是是写出来返回值类型。
}
函数调用:
函数名();
但是有返回值的函数,在函数调用时,在函数调用完成(函数结束)后,在函数的调用位置就是函数的结果值。
返回值是什么类型,根据前面函数所定义的函数的类型决定。
-
练习:实现一个功能,输入一个n ,计算1~n的累加和。打印结果
3.无返回值,有参数列表的函数定义;
没有参数列表的函数,只能用于一些固定的功能操作
如果函数功能中,需要用到一些值,但是这些值是不确定的值,把这些值设计为变量,做为函数的使用;在调用的时候把真实的具体值,传入给刚才的变量,就可以完成具体操作。
如果函数中的变量是用于接收在调用时传入的值,叫做参数变量
参数列表:就是表示这些用于接收调用时传入的值的这种变量
参数格式列表格式:类型1变量1,类型2,变量2...
void 函数名(参数类型 变量1,参数类型 变量2,...)
{
函数体;
}
函数调用:
函数名(实际值1,实际值2,实际值3)
实际值依次传给参数变量
有返回值,有参数列表的函数定义:
返回值类型 函数名(参数类型 变量1 ,参数类型 变量2,...)
{
函数体;
return +值;
}
函数的注意事项:
1.函数定义注意:
-
函数名不能相同
-
函数的参数和返回值
-
形式参数:在定义函数是,()里面定义的参数变量,简称形参。
-
形参变量,属于定义的这个函数,在实参传递时只接收值不能接收变量
-
实际参数:在函数电泳时,传入的值,简称实参
实参可以是变量、常量,表达式,甚至可以是函数调用
(使用函数调用的结果)
-
参数个数
实参和形参个数要匹配
-
参数类型
-
当实参和形参类型不匹配时,会自动把实参变为形参的类型
-
-
实参和形参只是值传递,即把实参的值传递给形参,而不是吧实参整个变量串给形参。
-
返回值
-
如果定义函数没有写返回值类型,默认为int
-
如果返回值(return 值),和返回值类型不匹配,则以返回值类型为准
-
函数声明
在C语言中,函数的定义是有讲究的
只有在后面定义的函数才能调用前面定义的函数
因为系统搞不清楚有没有这个函数
也搞不清楚有没有参合返回值类型
所以,就存在函数声明,在函数调用之前,告诉系统,该函数是什么样子
如果函数的定义是在函数的调用之后则需要进行函数声明
函数声明格式: 返回值类型 函数名(参数类型,参数类型,参数类型...); 返回值类型 函数名(参数类型 变量名,参数类型 变量名...);
-
-
-
-
变量分析
大小端----------计算机决定
把数据存储到空间时,如果会占用多个字节,会涉及到把数据的高字节存储到要占用空间打的地址还是小的地址
大端:
把低字节存储在大的地址,把高字节存储在小的地址中
小端:
把低字节存储在小的地址,把高字节存储在大的地址中
全局变量与局部变量
变量定义之后才占用空间
局部变量:在函数中或函数中的语句块定义的变量(main 也是函数)
作用域:能够使用变量的范围
在当前的语句块中
生命周期:变量什么时候会消亡(变量空间会被释放)
变量的存在时间,在当前语句块结束。
从定义开始到当前的语句快结束。
全局变量:在函数外定义的变量,叫做全局变量
从定义开始之后的函数都使用(整个程序)
从定义开始,到整个程序结束。
作用域:
生命周期:
注意:
在不同的作用域和生命周期,可以定义相同名字的变量
如果有不同作用域的变量,在使用时,使用的作用域小的变量。
数组
数组的基本概念
数组:就是一组数据,存储多个数据;数组就是用来存储一组数据;就是具有一定关系的若干变量的集合,用来存储多个数据值。
数组的几个名词:
-
数组:一组"相同数据类型"数据的有序集合
-
数据元素:在数组这个集合的每一个数据(构成每一组数据)
-
数组下标:数据预算位置索引
在之间使用,每一个数据都需要定义一个变量来存储,如果需要存储多个数据,则需要定义多个变量
数组:
可以一次定义多个变量进行使用,申请一段梁旭的空间(定义的变量类型乘以变量个数)来表示多个变量存储数据,这就叫做数组
有序的变量数据集合
数组的元素类型一致
数组的定义
定义:
元素类型 数组名[元素个数];
元素类型:数组中国每个成员(每个数组元素)是什么类型
数组名:整个数据(变量)集合的名字,这个名字表示整个数组元素个数:有多少个数据元素(变量)
数组的使用:
要使用数组,就是使用数组的元素,进行操作(数组就表示一次定义多个变量,当然使用的是定义的变量)
由于数组在定义时有序,谁是第一个数组元素,谁是第二个已经定义好了
访问:通过索引(数组下标)
数据名 [下标]
*数组的操作就是按照数组元素进行操作
数据的初始化:
在定义的时候赋值叫做初始化
在定义数组是进行赋值叫数组初始化。
-
完全初始化:对数组的每一个元素都进行初始化
-
有元素个数
-
元素类型 数组名[] ={元素值1,元素值2,元素值3...}
-
-
没有元素个数:在定义数组时,不写元素个数;根据[]的元素值个数,来确定定数组重大的元素个数。
-
元素个数根据元素之个数确定
-
-
部分初始化:对数组的部分元素进行初始化
-
按下标顺序,部分初始化
-
把元素值初始化给下标0元素,把元素值2初始化给下标1元素,其他元素都赋值为0
-
-
按照指定下标,部分初始化
-
需要初始化哪个就初始化哪个,没有顺序,没有初始化的元素自动赋值为0.
-
-
没有元素个数
-
按照指定下标,部分初始化
-
按照指定下标的最大值,作为数组的元素个数
-
-
-
字符串
-
字符类型
正式因为存储字符类型数据要转换0和1,C语言就设计了ASCII码,来表示字符要转换成什么样的0和1,在ASCII码中定义了每一个字符对应一个整数,只用把字符对应的整数转换成0和1就行。这个整数就表示对应的字符
字符的运算都使用字符对应的ASCII码整数进行运算
字符数组
字符数组:(数组:一组相同数据类型的数据集合)
一次定义多个字符变量,进行存储多个字符(一组字符类型的数据集合,有多少字符数据组成的集合)
定义一组字符数据集合来存储多个字符数据-------字符数组
如:
char 数组名[元素类型];
char 数组中每一个元素都是字符类型
元素个数:数组中可以存储多少个字符
-
是一种比较灵活的数据类型,占用一个字节空间,计算机只认识0和1,所以存储char 字符类型数据时,不是直接存储字符,二是将字符转换为0和1之后再存储
-
使用方式按照,数组的使用方式进行
char buf[10]={[4]='b'}
buf[0]='a'
字符序列,把多个字符按照向后顺序组合
如:hello========》字符串,用双引号表示是一个字符串"hello"
如果是一个字符串,会存在一个特殊的字符,在字符串的结束位置会多一个字符'\0'表示字符串结束
在C语言中,没有专门的一种类型来存储字符串类型--------------使用字符数组来存储字符串
把一个字符串存入一个数组时,会把结束符'0'存储数组中,表示字符串结束 字符数组后面的类容就不是字符串的内容
字符串存储到字符数组可以按照普通方式
也可以按照字符串的方式存储
字符串
把多个字符按照先后顺序组合,有序排列,形成一个字符序列。
字符串在C语言中以'\0'这个空字符表示结束。会在""最后位置存在'\0'字符
"hello"------------字符串常量
'a'-------------------字符常量
5---------------------整数常量
字符串在C语言中没有专门用于存储字符串的变量,通常使用字符数组来进行存储。(字符数组可以满足串的特点)字符串,类似字符串变量作用,因为字符数组每个元素都可以存储一个字符且可以修改
定义字符数组如下:
char buf[10]; 既可以当做数组存储多个字符,也可以当做是存储的字符串
如果字符数组中没有’\0’结尾,那该字符数组就是普通的字符数组,不是字符串。
字符数组:只要存储的最后一个字符后+'\0',就可以当做字符串进行使用
由于字符串存储字符数组,当然还是可以当做字符数组进行使用。
字符数组存储字符串时:(字符数组初始化为字符串)
char 数组名[大小]= "字符串"//会把字符串中的'\0'也存进去
字符串的输入输出:
输出字符串:
-
按照字符数组的方式进行输出
-
单个字符分别输出,形成一连串字符
-
-
按照字符串的方式进行输出
-
%s格式化字符,代表的是字符串,输出到\0为止
-
-
输入字符串
-
按照字符数组进行输入
-
按照字符串进行输入
-
scanf("%s",数组名);
-
-
sizeof运算符
-
计算数据类型大小
-
sizeof(类型)--------计算类型大小
-
sizeof(数据)---------计算这个数据对应类型的大小
-