常用语句
sizeof()
计算出所占字节数包含\0,每一个字符串都会默认自动添加一个\0作为结束标志
返回类型为%zu,但是可以用%d和%u等来接收
另外它是一个操作符
sizeof()常用于求非char类型数组的元素个数
char类型的数组一般用strlen()库函数求长度,strlen()判断到\0时停止计数
int arr[]={1,23,,4,5,,6,4};
int len=sizeof(arr)/sizeof(arr[0]);//整个数组字节除以一个元素字节
printf("%zu", sizeof("my name"));//打印为8 空格和\0都算一个字节
strlen()
求字符串长度函数
与sizeof不同,它不会包含\0,以字符串实际长度为返回值
需要头文件<string.h>
int a[10]={1,2,3};
printf("%d",strlen(a));//打印为3
typedef
类型(重)定义
typedef unsigned int u_int
int main()
{
unsigned int num=100;
u_int num2=100;//两条语句效果一样
return 0;
}
static
修饰局部变量时改变其生命周期,修饰所有变量都会只能在本文件使用,其他源文件不得使用(防止重名)
修饰局部变量:退出函数时不会销毁,但是仅在当前函数中,其他函数不能调用
void test()
{
static int a=1;//退出函数时a不会销毁
a++;
printf("%d\n",a);
}
void main()
{
test();
test();
//printf("%d\n",a);//这行语句会报错
//就算修饰了局部变量也不能跨函数调用
}
extern
声明外部符号
可以声明同工程下其他文件的全局变量,函数等
下面a文件跟b文件在同一工程下
//a.c文件
int g_val=2022;
int Add(int x,int y)
{
return x+y;
}
//b.c文件
extern int g_val;
extern Add(int x,int y);
int main()
{
printf("%d",Add(g_val,g_val));
return 0;
}
#define
定义常量和宏
常量:永远不会改变的量,频繁使用的数字建议定义为常量,因为可能会因为某些原因(甲方)进行更改,直接在#define定义的常量中更改会方便很多
#define pai 3.1415926 //定义的常量不会改变,并且是全局常量
#include<stdio.h>
int main()
{
printf("%lf",pai);
return 0;
}
宏:完整地替换
#define Add(x,y) x+y
int main()
{
int C=Add(1,2)*3;//相当于1+2*3 不用括号括起来 因为Add(1,2)就是1+2
return 0;
}
#define Add(x,y) ((x)*(y))
int main()
{
int c=Add(3*3,1+2);
return 0;//最优的写法是都加上括号,这样即便是表达式也可以很好的运算
}
gets()
输入函数,可以包含空格,而scanf()不能包含空格,按回车时录入
char arr[20]={0};
gets(arr);
puts()
输出函数,可以直接输出字符数组,用换行符取代字符串的结束标志\0
char c[10]="my name";
puts(c);
goto
goto+命名 可以直接跳转到 <命名:>的地方
for(int i=0;i<=100;i++)
{
int count=0;
count++;
if(count>133) goto dio;
}
dio: printf("当前count>133");
常用细节
数组名就是一个地址,数组首元素地址
实参:常量,变量,表达式,函数等
形参:当函数调用完成后就自动销毁了(函数名括号中的变量)
设计函数时,功能要单一,不要有打印函数等,以方便重复使用
优化函数,减少计算机的运算量
递归函数会加大计算机运算量,通常不会使用
不用第三个变量交换两个值
int a=3;
int b=5;
a=a^b;
b=a^b;
a=a^b;
整数在内存中存储的是补码
进行二进制位计算时 使用的都是补码,正数的三码都相同
负数:
源码 是其数用二进制表达出来,符号位(首位)为1
反码 符号位不变其他全取反
补码 反码的基础上+1
整型提升
int变char时只保留二进制的后八位(4字节变1字节)
char变int时前面都补齐符号位
没有符号位时补零
如 char的10000001
变为 int的11111111111111111111111110000001
指针在32位机器上是4个字节
在64位机器上则是8个字节
最好使用 传址调用
不用开辟新的空间 还可以通过地址来改变原来的值
传值调用
需要开辟出一块一样大的空间来存储形参,不能通过值来改变原来的值
传参是从右向左传参的
如 add(x,y) 先传入y,然后才是x
*&a <==> a
常用细节更新
赋值运算符返回值为左值 (已被右值赋值后的左值)
C语言小数默认为双精度类型,在小数后加上f为单精度
如 6.31f
sizeof() 是操作符,sizeof() 括号中的值 不参与运算
[] 是一个操作符 数组名和下标是两个操作数
arr[2] <==> 2[arr]
char类型是整型家族中的,用ASCII码来存储一个字符
\0的ASCII码为零 其他字符全为非零
printf()中类型如果与参数不符,将打印出0
数组名是数组首元素地址 但是有2个例外
sizeof(数组名)
数组名表示整个数组,计算的是整个数组大小,单位是字节
&数组名
数组名表示整个数组,取出的是整个数组的地址
全局变量未初始化时,默认值为0
不同类型进行比较时低的类型要转换成高的类型再进行比较
如: 一个int和一个unsigned int比较,int需要转换成unsigned int

表达式为真返回值为数字1 例: 2>1 返回值是1
待更新……