C语言阶段性总结
在学习前端的道路上,一开始就学习了C语言的一些基本知识,作为前端的垫脚石;历经差不多三周的学习,我就做做阶段性的总结吧;
一.软件
a) 软件分为两种:
i. 程序
ii. 数据
软件的定义:为了完成某些特定功能而编制的一到多个程序文件的集合;
程序的定义:计算机指令的集合;
程序和数据的关系:程序 ----->处理 ----->数据;
二.标识符(两种)
a) 系统预定义(关键字)
b) 用户自定义标识符
i. 不能和关键字重复;
ii. 只能用数字、字母、下划线组成,并且数字不能开头;
标识符也分为硬规则和潜规则,在这里就不一一说明,对计算机语言有过一定基础的童鞋都知道;
三.C语言的执行过程
a) 编写源文件 ---> 编译目标文件 -----> 链接头文件 -----> 运行可执行文件
b) 数据类型
i. 数据类型的作用:
1. 声明数据类型其实也间接性的定义了数据存储的空间大小、位置和格式;
c) 数据类型的分类:
注意:同一个一样大小的空间内存,实数存储的数据远远大于整数存储的数据(因为实数的指数原因)
整数的表示方式:
一个字节8位;
用字节位中的最高位来表示正数和负数;
例:
5 的二进制是 101
‘0’ 0 0 0 0 101 这就是正数;取决于字节位中的最高位,即第一位数
‘1’ 0 0 0 0 101 这就是负数;取决于字节位中的最高位,即第一位数
实数的表示方式;
实数是以浮点数形式存储的
其中涉及到 小数 和指数 的 概念;
例: 十进制实数类型 0.00123456
123456 -2 即:0.123456*10-2(这是10的负2次方)
小数部分一般都采用规格化的数据形式;
字符的表示方式:
ASCII码表 表示一个字节中存储的0-127之间
数字所对应的英文字符
A : 65 a : 97
小提示:大写和小写之间相差32
四.值
a) 常量;
i. 字面量 例: 5 一眼就知道值
ii. 符号常量 例: π 给常量取了一个名字
1. 符号常量的好处:
a) 便于修改;
b) 可读性
iii. 定义常量:
1. #define PI 3.14
a) 注意:
i. 声明常量的时候后面不加;
ii. 生命的地方放在main函数上面;
2. 还有一种方法定义常量
a) Const float PI 3.14
b) 变量
i. 顾名思义:随时发生变化的量
五.运算符&&表达式&&语句
a) 表达式:最终都有一个运行的结果;
i. 一目表达式:
1. 例 a++ 就是只有一个值参与运算
ii. 二目表达式:
1. 例:a+b 两个值参与运算
iii. 三目表达式:
1. 例: a ? b :c
a) 如果a 成立,b作为值;
b) 如果a不成立,c作为值;
b) 注意;
i. 在C语言中,0就是假,非0为真;
ii. 加了分号‘;’的都是表达式;
c) 复合语句:
i. {} 里面的多条语句;
d) 空语句
i. 例: 一行中只有 } 一个花括号的就是空语句;
六.循环语句&&判断语句
a) 注意:在这里就不一一说明了
b) Continue和break的区别
i. Continue: 跳过本次循环,即continue后面的语句不执行,再一次跳到判断条件;
ii. Break: 跳出本层循环;
c) If语句:
i. 单分支if语句
ii. 双分支
iii. 多分支
d) 头文件 #include <stdio.h>的写法
i. #include <stdio.h> 和 #include “stdio.h” 只是 执行顺序不同而已,过了其他无差异;
e) If语句也可以不加花括号
i. 不过这种情况一般用于其中只有一条执行语句时;
f) Do...while 和while 的区别
i. Do...while 就算条件不满足,也会执行一次;即 先执行在判断
ii. While 如果条件不满足,则一次也不执行;典型的先判断在执行;
七.数组
a) 概念:
i. 集合的一种,就是批量处理数据;
b) 结构:
i. 连续的内存空间; ------>内存利用率不高
ii. 一个数组只能存放同一数据类型;
iii. 空间大小一旦声明就不能改变;
c) 数组的两个缺点:
i. 长度 length’
ii. 类型 string
iii. 优点:
1. 简单;
2. 效率最高;
iv. 提起数组就不得不提起集合(接触过其他语言的童鞋应该都只带,比如java):
1. 集合的优点
a) 灵活,长度可变化,类型可变化
b) 由很多‘类’和‘接口’组成
d) 数组的定义:
i. 数据类型 数组名(随意取,不过最好见名知意) 【长度】
ii. C语言是不严谨的,比如数组声明的时候就必须为其定义长度;
e) 注意:
i. 当给‘数组’赋值时,比如有5个元素,但我只给其中一个元素赋值,那么其他元素默认为‘0’;
f) 数组下标越界(C语言不严谨啊...)
i. C语言中编译不会报错;
ii. C语言中运行也不会报错;
g) 二维数组:
i. 涉及到 行下标 和 列下标
ii. 定义格式: 类型 数组名 【】【】
iii. 初始化: 例: .................= {?,?,?,?},{?,?,?,?};
iv. 注意:在C语言中二维数组的行下标和列下表必须要写;
八.字符串
a) 在C语言中没有直接的字符串,只有字符串数组,不像其他语言中数据类型就有String
b) 字符串也是有大小的(平时没怎么注意吧):
i. 首字母按ASCII码表比较,第一个字符相等,就依次比较下一个,以此类推;
c) 说到这,就不得不提及几个函数(方法):
i. Strlen() 获取字符串长度
1. 括号里面学字符串数组名;
ii. Strcpy() 字符串copy
1. 相当于字符串copy, 格式:Strcpy(复制给哪个,本身字符串);
iii. Strcat() 字符串链接
1. 字符串链接:
a) 格式:Strcat(数组1,数组2);
i. 即把数组2的数据加载数组1的后面,此时数组1会发生变化,数组2不会发生变化;
iv. Strcmp() 字符串比较
1. Strcmp(字符串1,字符串2)
a) 说明: 当字符串1<字符串2,返回为负数;
当字符串1=字符串2,返回值=0;
当字符串1>字符串2,返回正数;
d) 注意:
i. 字符串接受时,scanf()里面不加地址符;
ii. 字符串接受时,不能输入空格;
e) ‘\0’作为字符串结束标志:
i. 例: char str 【10】
1. 如果存的是字符串,那么最多只能存9个,因为最后会有一个看不见的‘\0’来作为字符串的结束标志;
2. ‘\0’是控制字符串结束的标志:
a) 例: char str 【6】= “hello”;
如果 控制为 str 【2】=“\0”;
那么打印输出就会是 结果: he
不信你也可以试试......
f) 字符“\0”的ASCII码就是 0 ;
九.复杂数据类型(C语言特产)
a) 注意:在C语言中,复杂数据类型是C独有的,自定义类型(即成员属性)要不就是写在main主函数上面;要不就是在main主函数里面声明了,才能写在主函数的下面;
b) 结构体:
i. 关键字: struct 注意:里面的属性都是分开的,和java里面类定义的属性是一样的;
ii. 自定义类型:
1. Struct a {
Char name 【100】;
Int age;
};//分号是必须要的
iii. 注意:
1. 上面的 a 不是double、int等数据类型,而是我们自定义的数据对象类型;
c) 共用体:
i. 自定义类型:
1. Union 共用体名{
Int a;
Char b 【100】;
};
2. 里面的属性其实都是一个,当你给a赋值的时候,其实b间接性也被赋值了;
3. 共用体里面的字节取“最大的” 例:在这里就得取 Char b 【100】;
d) 枚举:
i. 枚举相当于规定具体的值,其他值cha不进去;
ii. 并且排序由自已决定,不按ASCII码表决定;
iii. 格式:
1. Enum 枚举名{
具体的值;//例:周一
具体的值;//例:周二
}
e) 指针:
i. 例:b=a;
1. 将变量a的值赋给b,而b得到的只是a的地址,所以可以说b是指向a的地址的一个指针;
2. 即b的值就是a的地址
a) 注意:b的地址不等于a的地址;
Ii. 指针:专门存放数据地址的类型
Iii. 语法;
例:double d = 3.14;
double(指针所指向什么类型的变量) *?(随意变量名) = &(地址符)d(变量名,即上面定义的d);
十.函数:
a) 注意:
i. 在函数里函数名不能重复;
ii. 返回值类型不能是数组;
iii. C语言中函数没有嵌套定义的,没有从属关系,各函数之间是独立的;
B). 数据的传递形式:
I. 值传递
Ii. 地址传递(用于数组)
注意:1.值传递的时候,如果是无返回值类型,不return时,对调用者是没影响的;
2.地址传递:数组调用方法的时候,采用的地址传递,不管调用的方法是否返回值,调用者的结果都将受被调用的方法所影响;
小提示:double %lf
Int %d
Long %ld
字符char %c
字符串 %s
Float %f
%8d 右对齐,即左边空8格
%-8d 左对齐,即右边空8格
%。2d 即 该结果保留两位小数