种一棵树最好的时间是十年前,其次是现在
顾名思义:类型重命名 作用:简化书写 作用对象;数据类型
typedef unsigned int uint;
struct Node
{
int date;
struct Node* next;
}Node;
//类型重命名
int main()
{
unsigned int a=10;
uint a=10;
struct Node* Phead;
Node* Phead;
{
void show()
{
static int i = 1;//只初始化一次
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
while (i < 10)
{
show();
i++;
}
}
运行结果:
反汇编看statia修饰的局部变量:
总结static修饰的局部变量的效果:
拓展:变量存储位置
下面的代码涉及:
总结static修饰的全局变量作用:
函数也有外部链接属性,该处和static修饰的全局变量极度相相似,这里不过多介绍
电脑的存储设备: 寄存器(集成到CPU上) 高速缓存(cache) 内存 硬盘
rigister修饰的变量的特点:
替换,注:其非关键字
#define NUM 2022
int main()
{
printf("%d\n", NUM);
int n = NUM;
int arr[NUM] = { 0 };
return 0;
}
#define ADD(x,y) x+y
int main()
{
int a = 10;
int b = 20;
int c = ADD(a, b);
printf("%d\n", c);
}
简单解释宏:
bit 比特位(1byte=8bit) byte 字节 (1kb=1024byte) KB (1MB=1024KB) MB (1GB=1024MB) GB (1TB=1024GB) TB (1PB=1024TB) PB 为什么 一个内存单元是一个字节:一个比特位忒小,一个KB忒大
int a=10;
//向内存申请4个字节的空间,
%p和%x打印的区别: %p全部(包括0)打印出来,按地址打印 %x部分(不包括0)打印出来,按数值打印
int a=10;
int* p=&a;
p拿到的是存放变量a的四个字节的内存的首字节的地址
*p:解引用操作符,意思是通过p中存放的地址,找到p所指向的对象(内容)
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));
return 0;
}
32位计算机:
64位计算机:
由分号;隔开的就是一条语句 分类:
C 语言中0为假,非0为真 表达式为假就是0,表达式为真就是1
错误用法:18<=100为假就是0,即使是10为真也就是1,然后后面也成立
if只能控制下面的一条语句,含多条语句时得用花括号括起来(这里的if else是一条语句)
if (a == 1)
if (b == 2) printf("b==2");
else printf("b==1");
//上面的代码等价于
if (a == 1)
{
if (b == 2) printf("b==2");
else printf("b==1");
}
//1.变量的命名(有意义,规范)
//2.空格,空行,换行
int firstname = 10;//不好
int first_name = 10;//好
int FirstName = 10;//好
这个这样写就是if else的意思(省略else,但是不好阅读代码)
void test()
{
int a = 3;
if (a == 3)
return 1;
return 0;
}
关于100==age//建议这样写,但是1==num%2就不用 如果少些了一个等号,就会报错,会出现表达式左边必须是可修改的左值的报错。(左右值的概念)
悬空else指的就是else和离他最近的上一个if匹配
当要输出星期一-天的时候用if elseif else麻烦,所以用switch
备注:case只能放整型&&常量表达式
int n = 1;
switch (n)
{
case n://错误
case 2.0://错误
case管的不止一条语句,但是建议加上{},或者封装函数
break
Switch可以嵌套(和if一样) 嵌套时: break只能跳出当前的switch(和for的一样)
continue
函数原型:int getchar(void)
scanf和getchai的区别:
缓冲区
int main()
{
char str[20];
printf("请输入密码:");
scanf("%s", str);
printf("请确认密码(Y/N)\n");
int ch = 0;
while ((ch = getchar()) != '\n');//当输入为925623 25028带有空格的时候,循环干掉这些空格+空格后的字符,'\n'为我们的回车
//int ch = getchar();//当输入的没有空格的时候,只用干掉我们最后的那个'\n'就可以啦
char ret = getchar();
if (ret == 'Y')
{
printf("Yes");
}
else
{
printf("No");
}
return 0;
}
非法额