C语言01:初识
目录
- 编译过程
- 数据类型
- 变量与常量
- 字符串
- 转义字符
编译过程
C语言是需要编译的
数据类型
变量与常量
变量分为局部变量和全局变量
如果全局变量和局部变量同名,则优先使用局部变量(就近原则),不建议将全局变量和局部变量设置成为同名的
变量的作用域和生命周期:
作用域:
-
局部变量的作用域是变量所在的局部范围。
-
全局变量的作用域是整个工程。
生命周期:
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
注:**变量定义只会被初始化一次,但是可以被多次赋值 **
全局变量可以跨文件使用
static
修饰全局变量,该变量只能在本文件使用
e.g. 用static修饰的变量
常量:
- 字面常量
const
修饰的常变量#define
定义的标识符常量- 枚举常量
#include <stdio.h>
//举例
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
3.14;//字面常量
1000;//字面常量
const float pai = 3.14f; //const 修饰的常量
pai = 5.14;//ok?
#define MAX 100 //#define的标识符常量
return 0;
}
字符串
以转义字符\0
结尾,在计算字符串长度的时候\0
是结束标志,不算作字符串内容。
注:C语言无字符串类型
#include <stdio.h>
//下面代码,打印结果是什么?为什么?(突出'\0'的重要性)
int main()
{
char arr1[] = "bit";
char arr2[] = {'b', 'i', 't'};//不会添加“\0”
char arr3[] = {'b', 'i', 't', '\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
转义字符
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));
// \32被解析成一个转义字符c
printf("%d\n", strlen("c:\test\328\test.c");
//答案:14
return 0;
}
函数
函数可以跨文件访问
耦合:
- 耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。
- 在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使类和构件之间的耦合最小。
- 分类:有软硬件之间的耦合,还有软件各模块之间的耦合。耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪些信息通过接口。
解耦:
- 解耦,字面意思就是解除耦合关系。
- 在软件工程中,降低耦合度即可以理解为解耦,模块间有依赖关系必然存在耦合,理论上的绝对零耦合是做不到的,但可以通过一些现有的方法将耦合度降至最低。
- 设计的核心思想:尽可能减少代码耦合,如果发现代码耦合,就要采取解耦技术。
常用关键字
static
-
修饰局部变量-静态局部变量 :
static
修饰局部变量:变量的生命周期变成全局的,作用域依旧只在本函数内有效。 使用方法:函数内部计数器 -
**修饰全局变量-静态全局变量 **:影响变量的作用域。
static
修饰全局变量,该变量只能在本文件使用 -
**修饰函数-静态函数 **:函数被
static
修饰后只能在本文件内使用
- static修饰变量
函数中局部变量:
声明周期延长:该变量不随函数结束而结束
初始化:只在第一次调用该函数时进行初始化
记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值
存储位置:不会存储在栈上,放在数据段
全局变量
改变该变量的链接属性,让该变量具有文件作用域,即只能在当前文件中使用
修饰变量时,没有被初始化时会被自动初始化为0
- static修饰函数
改变该函数的链接属性,让该函数具有文件作用域,即只能在当前文件中使用
结论:
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
#define
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
return 0;
}
指针
内存:
- 内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的 。
- 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
- 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址 。
指针变量大小:指针大小在32位平台是4个字节,64位平台是8个字节 。
习题
关于C语言关键字说法正确的是:
A.关键字可以自己创建
B.关键字不能自己创建
C.关键字可以做变量名
D.typedef不是关键字
答案:
C语言关键字:C语言定义的,具有特定含义、专门用于特殊用途的C语言标识符,也称为保留字
A:错误,关键字是语言自身定义的
B:正确
C:错误,关键字具有特殊含义,不能作为变量名
D:错误,typedef是用来给类型取别名的关键字
下面那个不是关键字:
A.int
B.struct
C.define
D.continue
答案:
define不是关键字,是编译器实现的,用来定义宏的预处理指令,不是C语言中的内容。 int、struct和continue都是C语言中包含的关键字。
用在switch语言中的关键字不包含哪个?
A.continue
B.break
C.default
D.case
答案: switch是用来进行多分支选择的语句,一般结构是:
switch(变量表达式)
{
case xx1:
// ...
break;
case xx2
// ...
break;
default:
// ...
}
当变量表达式的内容与某个case后的常量相等后,就执行该case下的语句,break表示该case以后的内容不会执行,如果没有跟break,会继续执行当前case之后的case分支。
当变量表达式的内容没有与那个case匹配,就会执行default下的内容。
switch中常用的关键字:case 、break、 default,当然case中语句比较复杂时,可能会用if进行判断。
continue是用来结束本次循环的,而switch不是循环,因此其中不能使用continue关键字。
关于指针说法正确的是:
A.sizeof(char*)大小一定是1
B.指针是个变量,用来存放地址
C.指针变量的大小都是4个字节
D.指针不是变量
答案:本题主要考察指针的相关特性
A:错误,指针是一种复合数据类型,指针变量内容是一个地址,因此一个指针可以表示该系统的整个地址集合,
故按照32位编译代码,指针占4个字节,按照64位编译代码,指针占8个字节(注意:不是64位系统一定占8个字 节,关键是要按照64位方式编译)
B:正确
C:错误,参考A选项解释
D:错误,该条描述比较模糊 指针可以认为是一种数据类型,也可以认为是定义出来的指针变量