C基本知识点复习–1
C语言作为基础几乎每个学编程的人都是从C语言起步 C语言又称作造轮子的工具 所以花点时间把C的知识点简单的过一遍是很有必要的 (还记得从小到大多次想学编程 都是从C语言的hello world 起步然后就止步了哈哈哈)
C语言的优缺点
优点
- 可移植性:C语言是高度可移植的,你在不改动或者只做很小改动的情况下,就可以把C语言的程序运行在不同平台
- C语言很小:C语言完全基于变量,宏命令,函数和架构,整体非常小,因此C语言可以嵌入几乎现代所有微型处理器中,从冰箱到闹钟
- 学会C学会一切:几乎所有编程语言都由C语言实现,或者有着和C语言一样相似的语法和逻辑规则,因此,学会C语言能使你很快学会其他语言
缺点
- 运行时间:C语言没有运行时间检查机制
- 面向过程:C语言不支持面向对象编程,这就是为什么创造C++
- 不安全:指针是C语言的一大特色,可以说是C语言优于其它高级语言的一个重要原因,但也就是因为它有指针,可以直接进行靠近硬件的操作,所以带来很多不安全的因素
C语言环境
- 文件编辑器:Vi/Vim,Notepad…
- 编译器: GNU-GCC
C语言的编译过程
预处理, 展开头文件/宏替换/去掉注释/条件编译 (test.i main .i)
编译, 检查语法,生成汇编 ( test.s main .s)
汇编, 汇编代码转换机器码 (test.o main.o)
链接 链接到一起生成可执行程序 a.out
关于编译过程的详细讲解:c语言编译过程详解,预处理,编译,汇编,链接(干货满满)
c语言中一些常见的关键字
数据类型
基本,枚举,void,派生
基本类型:整数类型及浮点型
枚举:离散的数值
void:函数返回为void ;函数的输入为void ;指针的指向为void(例如void *malloc(size_t size)返回的为空指针,再转换成任意类型的数据)
派生:指针,数组,结构,共用体和函数等
变量
变量的声明及定义
type variable_list; /*变量类型 + 变量名称*/
声明:表明类型和名字,不分配储存空间
定义:为变量分配储存空间
使用extern声明全局变量或函数的作用范围(可见性) ,extern声明也不分配储存空间
与extern相对应的是static
注意:
- extern int a=10; 这是个定义因为有定义表达式
- 变量可以多次声明但是只能一次定义
- 对于函数的定义 编译器会默认前面加上extern
- 在头文件中一般只声明变量不定义 这样为了防止变量的重复定义 (这个在C中很重要)
- 先声明再使用
这一块有一个很有意思的问题 就是extern static const volatile的用法以及作用域的问题
extern:修饰全局变量或函数,表示该变量或函数在其他文件可见
static:局部变量或程序,表示该变量或函数只在其作用域或函数只在其文件内可访问
const:修饰常量(但有些编译器下可能只是限定不能作为左值出现,这是因为常量还是存储在全局数据区而不是全局只读区)
volatile:强制编译器减少优化 必须每次从内存中取值 多用于嵌入式应用中 目的是因为目标值可能会出现意外更改
😐 以上仅为暂时的个人理解 看了网上好多讲解看晕了都
C储存类
auto类储存
auto 存储类是所有局部变量默认的存储类。
register储存类
register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个字节),且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)。
static储存类
static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
在 C 编程中,当 static 用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享
extern储存类
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 ‘extern’ 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。
运算符
一些注意点:
- a++ 和 ++a a++为先赋值再自加 ++a为先自加再赋值
- = 为赋值 == 为判断是否相等
- && 逻辑与 ; || 逻辑或 ; !逻辑非
- &位与; |位或; ^异或; ~取反; <<二进制左移位; >>二进制右移位
- sizeof()返回变量的大小
- &取值
- *指针指向变量
- ?: (条件是否为真?是为X:否为Y)
if判断
这个懒得写了~
switch判断
主要结构:
switch(){
case situationA:
funcA();
break; //break为可选,一般没有K的话会继续执行直到遇到break
case situationB:
funcB();
break;
default: //default为可选,当所有case不满足时 执行default的function
funDefault();
}
switch中还可以嵌套switch
循环
for循环:
for(init;condition;increment){
statement();
}
for(初始化控制变量;判断条件;更改控制变量)
循环流程:先初始化控制变量->判断执行条件->若为真则执行循环内程序->循环内程序执行完成后更改控制变量->判断执行条件
for(;;)为无限循环
while循环
while(condition){
statement();
}
只要condition为真就会循环执行statement()
while(1)为无限循环
do…while循环
除了在尾部检查condition外和while循环一样,至少保证statement会执行一次
do
statement();
while(condition)
break和continue
break用于跳出当前loop或switch
continue表示跳过当前循环强迫开始下一次循环
例如:
#include <stdio.h>
int main ()
{
/* 局部变量定义 */
int a = 10;
/* do 循环执行 */
do
{
if( a == 15)
{
/* 跳过迭代 */
a = a + 1;
continue;
}
printf("a 的值: %d\n", a);
a++;
}while( a < 20 );
return 0;
/*最终输出:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
*/
}
goto语句
会跳到标志位执行,但是一般不建议用,因为使得程序流难以追踪,程序难以理解和修改
goto label;
..
.
label: statement;
函数
几个注意点:
- 函数的声明要在使用前面
- 函数声明不带函数主体
- 函数执行时有两种参数调用类型,传值调用和引用调用,传值调用只是把实际参数赋给函数内的形式参数,不会影响参数的实际值 。引用调用则是将参数地址传给函数内的形参,这样函数操作会直接修改参数的实际值
- 函数声明时参数名不是必须的 故 void func(int,int) 这种声明也是可以的
C语言中变量作用域
局部变量:定义在函数内部的为局部变量,只能在函数内部使用,在函数生命周期内有效,可与全局变量同名 优先覆盖全局变量
全局变量:定义在函数外部,通常在函数顶部,在整个程序的生命周期内有效
形式参数:函数的参数 可与全局变量同名 优先覆盖全局变量
注意!!!全局变量定义时会自动初始化,而局部变量不会,所以在使用局部变量时最好要正确初始化 否则可能会有惊喜~~