不断有前辈跟我推荐,学习技术要写博客。既可以巩固记忆,又能时时回顾,发现不足。今天尝试写下第一篇!
大一学过C语言,但是仅仅是会解一些很简单的问题,比如鸡兔同笼,一元二次方程组这样的。学的很浅,在后面实际运用的时候往往一脸懵逼,不知如何下手,没有完成过一个比较完整的项目。现在深知嵌入式开发这条路C语言的重要性,索性重新来过,来自华清创客学院小美老师的教程,顺便把Linux也了解了解。学了9天,每一个例程都亲手写过,运行过。
下面是当时学习时用word做的简要记录,先从零散写起,希望后面的博客能有自己的体系目录,慢慢来吧!
Day 2
注意各个数据类型的长度与数值范围。
ASCII码表中,常用的符号要记熟。
字符串的结尾都是 ’\0’
输入长度要小于堆栈数。
define宏定义时最好都加括号,以免引起歧义。
变量存储模型:4种,占据存储空间的大小由其类型决定。变量在内存空间的首地址,称为变量的地址。
auto、register、static、extern
auto为局部变量,只能在某一个范围内去使用,函数体内或者复合语句内。
register为寄存器型,将变量放入寄存器中,加快程序运行速度。但是register速度快,数量少,一般申请不到,就使用普通内存。占用寄存器,也可能导致其他部分无法使用寄存器。且register变量必须是CPU能接受的类型,一般长度应小于等于整型的长度。寄存器中无地址而言,寄存器也就用不了指针。
static静态存储类型变量,使变量一直存在,在内存中固定地址,不是以堆栈方式存放。只要程序没结束,在内存中就不会被销毁。下次再调用该函数,不用再次声明,且还保留上次的值。
Extern变量,当变量在一个文件中的函数体外说明,则项目中所有其他文件中函数或程序段都可引用这个变量。(全局变量)
extern称为外部参照引用型,使用extern说明的变量是想引用在其它文件中函数体外部说明的变量。
要注意的是,Static修饰的全局变量,其他文件无法使用。
运算符:
两个float/double之间不能取余(a%b)。
使用非(!)的时候,后面条件一般加括号,提高先决条件优先级。如!(a<5)
i++先取值再运算,++i先运算后取值。
多个逻辑与时,从左至右依次判断,只要有0了结果就都是0。
多个逻辑或,只要有1结果都是1.
Day 3
位运算符:逐位运算,与或非,左移右移,异或(相异为真)
三目运算符:
x>y ? x+2 : y+2
简略版的if-else结构
逗号运算符:从左到右执行,由最后一个表达式赋值给待赋值变量;
例如 y = (x++, y++, x+y)
sizeof(),以字节为单位,计算数据占据空间大小,只针对变量数据类型;
优先级:
最好加括号,以免专门判断优先级
格式输出:
附加格式符:
#include<stdio.h>
int main(int argc, char *argv[]){
int a = 234;
float f1 = 234.456;
char ch = 'a';
printf("%8d\n%2d\n",a,a);
printf("%9f-%9.2f-%.3f\n",f1,f1,f1);//%9f意思是保留9位小数,%9.2f表示保留2位小数,但是整个结果要占9位。
printf("ch = %5c\n",ch);
return 0;
}
对于字符串’Hello,World!’,%15s意思是输出15位字符,不够的用空格补齐;%15.5s是原字符串只保留5位字符,剩下的空格补齐;%2.5s保留字符串的5位,如大于2,就直接输出前5位。
带0和+的,用来补齐空位即可,注意+号要占用0的位置。
getchar()
scanf中,用%4d%2d,则自动给输入的数值分段,分别赋值给多个变量。
字符型变量连续输入,不能加空格,因为空格也被认为是一个字符。
清理键盘输入整型后的换行符,空格等垃圾符号。以免影响后续输入。
用getchar();
scanf获取字符串,不能带空格,除非用循环来接收;
所以一般用gets(),以回车换行作为结束标志。
注意:puts();输出完会默认地自动换行。\n
Day 4
控制语句,先掌握知识性的语法,重点是后续运用练习,构建自己解决问题的写法。
if后只有一行时,可以不加{}。如果大于1行,则必须加{}。
写逻辑条件时注意比较符号写对,等于比较时最好把数字放前面。
vi命令行模式下,输入gg=G可以快速自动调整格式。
Switch后各个case的值必须不相同,当表达式的值和case后的常量表达式相等时,就执行case后的语句。break是当与case匹配并执行后跳出switch体。
如果都不加break,则匹配case后,也会执行后边case的所有语句。
default最好放最后,break就可省略。放前面的话也要加break。
几种分支执行同样语句时,可以共用,如下的分数评级程序。
枚举型enum,格式:
enum DAY{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。
没有指定值的枚举元素,其值为前一元素加 1
在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。
用法:
enum DAY{
MON=1, TUE, WED, THU, FRI, SAT, SUN};enum DAY day;
也可枚举和变量一起定义。
goto语句可能会打破流水线,影响效率。Goto也会大大提高程序结构清晰度,还可以把所有的函数出口集中到一处。
For循环:
第一步初始化赋值,第二步判断,为真后依次执行3,4.
Break只能跳一层循环;
用getchar把用户误输入的内容吃掉,清理输入缓冲区,然后用户才能重新输入。
数组:
里面的数据类型要相同。一维数组在计算机的内存中是连续存储的。
C语言对数组不作越界检查,靠程序员自己把控范围。
冒泡交换,n个数最多需要交换n-1轮,每一轮都是相邻两个数依次比较,每一次都把这一轮大的数移到最后。