bool类型的量
void main()
{
bool a = 0;
a = -1;
printf("%d\n", a);
system("pause");
return ;
}
结果:
结论:真有千千万,而假只有一种。(简单来说bool类型的变量只有给它赋值为0它才为0负责都为1)。
那么bool flag=随机值 flag的结果是1,因为随机值是非0的值。
数组
数组存在的意义就是为了查表。
所谓的C语言的内存四区:
- 代码区 .text
- 栈区 .stack
- 堆区.heap
- 数据区.data
俩个凡是:
- 凡是在函数之外定义的变量都在数据区。(等价于全局区,但是我们这里一般说成数据区)
- 凡是在函数内部定义的变量都是局部变量
一个关于全局变量的例子
int a=0;
int main()
{
static int ar[13]={29,31,..........} ;
}
int b=0;
上面的代码可以通过编译,原因是全局变量和main函数的位置无关。
static在C语言中的作用
static(防止重复出现栈空间)
void fun()
{
int a=10;
static int b=20;
printf("%d %d\n",a,b)
}//(函数要挂了,static 修饰的变量不挂); static 修饰的变量在 .data区。
可以防止多次调用函数时,大量不变的数据被多次初始化(例如我们返回每个月份的天数的时候,int Days[13]={29,31,28,30,31,30,31,31,31,30,31,30,31}如果每次都在函数中执行该语句将会浪费大量的时间和空间。),浪费时间和空间(我们程序解决的问题就是要在尽可能的节省时间或者空间)所以说如果不用static修饰则会浪费资源,这样是不能被接受的。
例如我们在函数中查表得时候,由于每次调用函数得时候查表,数组中的内容无变化,但是每次都要在栈空间上申请那些没有变化的值是没有意义的。所有我们这时候便可以用static修饰使得为那些我们需要它不被多次浪费资源的变量“延寿”。
宏
宏:本质就是替换的概念,该操作发生在预编译阶段,不检查类型。
1,#define int int* (正常来说我们不可以这么做,但是凡是带“#”开头的语句,全部发生在预编译阶段,这个阶段不做变量检查,只做替换的操作,所以这样的语句可以通过编译。)
2,
void main()
{
int arr[] = {
#include "number.txt"
};
int n = sizeof(arr)/sizeof(arr[0]);
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
system("pause");
return ;
}
//file:number.txt
1,2,3,4,5,6,7,8,9
结果:
结论:可以知道#include 进来的头文件就是将文件的内存插入程序中来。
打开预处理生成的.i文件可以看到
...
void main()
{
int arr[] = {
#line 1 "c:\\users\\goingjack\\desktop\\dailytraining\\dailytraining\\number.txt"
1,2,3,4,5,6,7,8,9
#line 10 "c:\\users\\goingjack\\desktop\\dailytraining\\dailytraining\\bool.cpp"
};
int n = sizeof(arr)/sizeof(arr[0]);
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
system("pause");
return ;
}
...
3,
#define MAX(a,b) ( (a)> (b) ? (a): (b))
//宏a,具有一定范性能力 替换没有类型。b,副作用 MAX(++y,z) ===> (++y)>(z)?(++y):(z) y加了俩次。
(int max_int(int a, int b) { return a > b ? a : b; }//函数不具有副作用)
三种方法定义常量:
#define MAX 1024===》1,发生在预处理阶段,实质上相当于做了替换操作 。2,不占用内存大小。3,不做类型检查
const int n=1024 1,发生在编译阶段。 2,要做类型检查。3,占有内存 。4,修饰的变量具有只读属性无法进行修改。
enum{len=1024};1,枚举常量属于常量占用内存大小。2,枚举常量具有类型,具有于普通变量相同的诸如作用域、值等性质。
3,枚举可以限制函数某个参数的输入。4,枚举可以一次定义大量相关的常量,而宏只能定义一个。