学习笔记(1"/>
C语言学习笔记(1
目录
一.初识
·计算机如何解决问题?
·计算机思维——程序的执行
·C语言用在哪里?
·编译->运行
·程序框架
二.常变量、IO及表达式
·输入输出
·变量
·常量
·赋值和初始化
·浮点数
·表达式
·交换变量(略)
·复合赋值和递增递减
三.判断
·判断的条件
·嵌套的判断
·级联的if-else if
·if常见错误
·switch-case语句
四.循环
·while循环
·do-while循环
·for循环
·判断素数
·break 和 continue
·输出整数
·最大公约数
五.数据类型
·C语言的类型
·区别
·sizeof()
·整数的范围
·整数的输入输出
·浮点类型
·字符类型
编辑
·逃逸字符
·自动类型转换
·强制类型转换
·逻辑类型--bool
·逻辑运算
·条件运算符
·逗号
六.函数
·什么是函数?
·函数的定义
七.数组
·定义数组
·特点
·下标范围
·数组的集成初始化
·数组的大小
·数组的赋值
·二维数组
八.指针
九.字符串
十.结构类型
十一.全局变量,宏,头文件
十二.IO
十三.链表
一.初识C语言
·计算机如何解决问题?
人:what to do
计算机:How to do
计算机是按照一步一步的步骤实现,而程序就是用编程语言告诉计算机如何做
算法:找出计算的步骤然后用编程语言写出来
·计算机思维——程序的执行
计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。有两种转换方式:
·解释:是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。解释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行,所以只要某一平台提供了相应的解释器即可运行该程序。解释型语言每次运行都需要将源代码解释称机器码并执行,效率较低,如:Python
·编译:在编译型语言写的程序执行之前,需要一个专门的编译过程,把源代码编译成机器语言的文件,如exe格式的文件,以后要再运行时,直接使用编译结果即可,如直接运行exe文件。C、C++、Objective等
(参考:编译型语言和解释型语言的区别? - Tsingke - 博客园 (cnblogs))
·C语言用在哪里?
操作系统
嵌入式系统
驱动程序
底层驱动
图形引擎、图像处理、声音效果
·编译->运行
编译器 MinGW Cygwin(gcc/cc/g++)
C语言需要编译才能运行,所以需要编辑器+编译器;或者IDE(集成开发环境)
·程序框架
到函数之前,所有的c程序都需要这一个框架
#include<stdio.h>int main(){return 0; }
二.常变量、IO及表达式
·输入输出
printf
scanf
输入和输出同在终端,输入是以行为单位进行的,按下回车代表行结束。在按下回车前程序不会读到任何东西。
·变量
保存数据的地方
类型名称 变量名称
int prince;
标识符
字母 数字 下划线(不能以数字开头)
关键字(保留字)
·常量
比如10,100
或者const int a=100;不能再被修改
·赋值和初始化
a=b 表示b的值赋值给a
int a=1初始化
·浮点数
带小数点的数值。(还有一种表示小数的,叫定点数,但是在c语言中看不到)
对于整数运算,结果也只能是整数 。当浮点数和整数放到一起运算时,c会将整数转换成浮点数,然后进行浮点数的运算。(翁恺 p15 2.1.6)
- float单精度浮点数
输入输出均用%f
- double双精度浮点数
输入用%lf输出用%f
·表达式
- 运算符+算子
- 运算符 + - * / %(取余)
- 算子 参与运算的值
·交换变量(略)
·复合赋值和递增递减
复合赋值 += -= /= *=
递增递减 只能是在变量上 -- ++
注意:a++是先使用后加1,a++的值是a;
a--是先加1后使用,值是a+1
最好不要组合到表达式中
三.判断
if 语句
if(条件成立){..... }else{..... }
·判断的条件
·计算两个值的关系(关系运算)
关系运算的结果 只能是0(不成立)或1(成立)
所有的关系运算符的优先级比算术运算符都低,但比赋值高
·嵌套的判断
else 总是和最近的if配对
代码的缩进也不能暗示代码的配对
所以:在if和else后面总是用{}
·级联的if-else if
if(exp1){...}
else if(exp2){...
}
else{...}
·if常见错误
- 忘记大括号
- if后面加了分号
- 错误使用==和=
·switch-case语句
switch( 控制表达式 ){case 1: .....;//可以添加break;case 2: .....;.....default: .....;}
控制表达式只能是int型,常数可以是常数也可以是常数计算表达式(1+1)。
考虑使用break语句,并且使用单一出口。
四.循环
·while循环
while(判断条件){循环体;}
·do-while循环
do
{循环体语句;}whlie(循环条件);
先进入循环再检查条件
·for循环
for(初始条件;判断;完成一次后做的)
{循环体
}
·判断素数
int a;scanf("%d",&a);int isPrime = 1;for(int i = 2;i<a;i++){if(a % i == 0 ){isPrime = 0;break;}}if(isPrime == 1) printf("%d是素数",a);else printf("%d不是素数",a);return 0;
·break 和 continue
break 跳出循环
continue 跳过循环这一轮剩下的语句 进入下一轮循环
注:都只能对他所在的那一层循环做
要想跳出多层循环:
或者:goto语句
·输出整数
逆序
方法一
每个数字依次输出
int a,b;scanf("%d",&a);int t = 0;do{b = a%10;t = t*10 + b;a /= 10;}while(a>0);printf("%d",t);return 0;
方法二
可以排除末尾为0的情况,一次输出
int a,b;scanf("%d",&a);while(a>0){b = a % 10;printf("%d ",b);a /= 10;}return 0;
正序
先算出整数的位数n,然后依次整除10^(n-1)输出
int a;scanf("%d",&a);int copy = a;//计算位数int cnt = 0 ;while(copy>0){cnt++;copy /= 10;}printf("%d\n",cnt);//正序输出int b;for(int i = 1;i<=cnt;i++){int j = pow(10,cnt-i);b = a/j;printf("%d ",b);a %= j;}return 0;
·最大公约数
一.枚举(略)
二.辗转相除法
五.数据类型
C是有类型的语言,变量在使用前必须:
在使用前定义;并且确定类型。
·C语言的类型
- 整数
char 1字节(8比特)
short 2字节
int 取决于CPU 通常一个字 4字节
long 取决于CPU 通常一个字
long long 8字节
- 浮点数
float 4字节
double 8字节
long double
- 逻辑
bool 1字节
- 指针
- 自定义类型
·区别
·sizeof()
输出所占的字节
·整数的范围
数的范围
(最高位为符号位)
整数的范围
·整数的输入输出
%d 和 %ld
%u 和 %lu
·浮点类型
输入 输出
float %f %f 或%e(科学计数法)
double %lf %f或%e
%g:小数点右侧的尾数0不被显示;显示小数点仅当输出的小数部分不为0。
输出精度
在%和f之间加上.n可以指定输出小数点后几位,这样做是四舍五入的
超过范围的浮点数
printf输出inf表示超过范围的浮点数(无穷)
printf输出nan表示不存在的浮点数
·字符类型
char c = 1;char d = '1';if( c == d){printf("相等\n");}else{printf("不相等\n");}return 0;>>>不相等
整数和字符不相等
·逃逸字符
用来表达无法印出来的控制字符和特殊字符,以\开头和另外一个字符组合
·自动类型转换
printf的时候 小于int的会自动转换成int;float会转换成double
而scanf的时候不会
·强制类型转换
(类型)值
一般是把一个量强制转换成另外一个类型(通常是较小的类型),要注意安全性
如(int)10.2 (short)32
他并不会改变变量,无论是值还是类型,只是计算出了一个新的类型的值
例如:将一个字符转换成ASCII码,可以强制类型转换成int
·逻辑类型--bool
要声明头文件 #include<stdbool.h>
bool b = 6>5;
不过结果还是0或者1,实际上还是整型
·逻辑运算
优先级 !> &&> ||
·优先级
·条件运算符
count = (count >20)? count - 10 : count+10;
优先级仅高于赋值语句
·逗号
仅在for中使用
for(i=1,j=2;....)
六.函数
·什么是函数?
函数是一块代码,接收零个或多个参数,做一件事情并返回零个或一个值。
·函数的定义
·函数的调用
函数名(参数)
- 参数要给出正确的结构,数量和顺序,即使没有参数也要加()
- 如果调用的值和参数类型不匹配是c语言的漏洞,编译器会将类型转换好。但是可能不是预期的结果
从函数中返回值
- return作用:停止函数的执行,并返回一个值
- 一个函数可以出现多个return,不过不符合单一变量原则
return;return 表达式;
没有返回值的函数
- void表示空类型的函数不需要返回,其他所有的函数都需要return来返回值
- 不能使用带值的return
- 不能将函数返回值进行赋值
区别:void可以直接进行输出(printf),但函数执行完成后不能再进行其他的操作;
其他的可以将返回值返回给函数,然后可以进行赋值等后续操作
函数的原型声明
程序是自上而下读取的的,如果函数在主函数后面就要声明。
函数原型:函数头,以分号结尾就构成了函数原型。
作用就是告诉编译器函数长什么样子(名称,参数,返回类型)
传过去的是什么?
c语言在调用函数时,永远只能传递值
- 因为每一个函数都有自己的变量空间,参数也位于这个空间,和其他函数无关
- 形参 实参
本地变量
- 函数的每一次运行,产生自己的变量空间。参数也位于这个空间,和其他函数无关。
- 定义在函数内部的变量就是本地变量,参数也是
生存期和作用域
大括号内--块
规则
其他细节
- 当没有参数的时候尽量在括号里面写void,否则可能会报错
- C语言不允许函数的嵌套定义
- 不要在return中加括号 return(i);
- int main()也是一个函数,return 0;有意义。
七.数组
·定义数组
类型 变量名称[元素数量];
·特点
· 所有的元素具有相同的数据类型;
· 一旦创建 不能改变大小
· 元素在内存中连续依次排列的
·下标范围
[ 0 , 数组的大小-1 ]
·数组的集成初始化
int a[ ] = {1,2,3,5,6,3,4,5}; //此时编译器会计算数组大小
int a[10] = {1}; //此时只有a [0]是1,其余全为0
int a[10] = {0}; //全为0
集成初始化时的定位
int a[10] = { [0] = 1, [2] = 3 , 4 };
·数组的大小
sizeof(a)表示数组整个所占的字节
sizeof(a [ 0 ])表示单个元素字节
则数组的大小 = sizeof(a)/ sizeof(a [ 0 ])
·数组的赋值
·数组变量不能被赋值
·要把一个数 组的所有元素交给另外一个数组,必须采用遍历
·二维数组
int a[i] [j];
通常理解为a是一个i行j列的矩阵
初始化和一维数组类似
int a[] [5] = { {1,2,3,4,5},{1,2,3,5,6}} //可以没有行数,必须要有列数
八.指针
九.字符串
十.结构类型
十一.全局变量,宏,头文件
十二.IO
十三.链表
更多推荐
C语言学习笔记(1
发布评论