数组
一组数的意思
c语言中给数组的定义:一组相同类型元素的集合
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};//arr为数组名,int为元素类型
int arr1[10]={1,2,3,4,5}//初始化数组arr1的前5个元素为1,2,3,4,5,剩下的五个元素默认都为0
return 0;
}
如图在内存中找了连续的空间,名字为arr,下面对应的元素的下标。
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
//printf("%d",arr[5]);//打印结果为6
访问数组全部元素,一次一个个打印
int i=0;
while(i<10)
{
printf("%d",arr[i]);
i++;
}
return 0;
}
操作符
单目操作符
~ 按位取反
把十进制的数字可以转换成二进制
二进制有三种表示形式:原码,反码,补码
二进制位中最高位是符号位
最高位是1,表示负数
最高位是0,表示正数
1000000000000000001-原码
0111111111111111110-反码
0111111111111111111-补码
整数在内存中存储的是二进制表示的补码
正整数的原码、反码、补码相同
int main()
{
int a=0;
printf("%d\n",~a);//-1
//00000000000000000000000000000000
//11111111111111111111111111111111--补码
//11111111111111111111111111111110--反码
//10000000000000000000000000000001--原码
return 0;
//把十进制的数字可以转换成二进制
//二进制有三种表示形式:原码,反码,补码
//二进制位中最高位是符号位
//最高位是1,表示负数
//最高位是0,表示正数
//1000000000000000001-原码
//0111111111111111110-反码
//0111111111111111111-补码
//整数在内存中存储的是二进制表示的补码
//正整数的原码、反码、补码相同
}
++操作符,–操作符
int main()
{
int a=10;
int b=a++;//后置++,先使用a的值,再让a+1,a参与运算后加一
printf("a=%d b=%d",a,b);//a=11 b=10
int c=10;
int d=++c;//前置++,先给c的值加一,再参与运算
printf("c=%d d=%d",c,d);//c=11,d=11
int e=10;
int f=e--;//后置--,先使用e的值,再让f-1,e参与运算后-1
printf("e=%d f=%d",e,f);//e=9 f=10
int g=10;
int h=--g;//前置--,先给g的值-1,再参与运算
printf("g=%d h=%d",g,h);//g=9 h=9
return 0;
}
(类型)强制类型转换
int main()
{
int a=(int)3.14;//将3.14转换为整型
printf("%d\n",a);
return 0;
}
关系操作符
//>,>= ,<,<=,!=(不等于),==(等于)
int main()
{
int a=5;
if(a=3)
{
printf("haha");//这里会打印吗?
}
return 0;
}
答案是会打印,因为if判断语句里面a=3,只是把3赋给a,此时a=3,为真,所以会进来打印,判断a=3应为a==3
逻辑操作符
逻辑与
int main()
{
int a=3;
int b=5;
int c=a&&b;//逻辑与
printf("%d",c);//看a与b的真假,a,b都为真才为真
return 0;
}
逻辑或
int main()
{
int a=0;
int b=5;
int c=a||b;//逻辑或
printf("%d",c);//看a与b的真假,a,b都为假才为假;当a,b至少一个为真时则为真
return 0;
}
条件操作符( 三目操作符)
exp1?exp2:exp3
exp1满足,则执行exp2,否则exp3
int main()
{
int a=10;
int b=20;
int max=0;
/*if(a>b)
{
max=a;
}
else
{
max=b;
}*/
max=(a>b?a:b)//与前面注释等价,a>b,执行a,否则执行b
return 0;
}
逗号表达式
int main()
{
//逗号表达式从左向右依次计算,但是整个表达式的结果是最后一个表达式的结果
int a=(3+1,5+2,8+2,2+4);
printf("%d\n",a);//6
return 0;
}
下标引用操作符、函数调用操作符
int main()
{
int arr[10]={1,2,3,4,5};
arr[3]=5;//这里的[]就是下标引用操作符
return 0;
}
int main()
{
printf("hello world");//()为函数调用操作符
return 0;
}
常见关键字
auto
int main()
{
{
int a=10;//auto关键字是省略掉的
//局部变量都是自动创建,自动销毁的,所以c语言中的局部变量就是自动变量
}
return 0;
}
break-循环/switch语句
continue-循环
case-switch case
default–应用于switch
enum-枚举关健
extern-声明外部符号的
//extern声明一下来自外部的符号
//一个文件创建的全局变量可以在另一个文件中用extern声明,则可以使用
goto语句–不建议使用
register-寄存器-关键字
//寄存器也是一种存储器
//电脑上的存储器:硬盘、内存、高速缓存(cache)、寄存器
int main()
{
register int a=10;//当a频繁使用时,建议把a放在寄存器中,对a的处理更快
//编译器决定
return 0;
}
signed-有符号的
当一个数有正负时,可以使用 signed int num;定义;当一个数无负时,可以使用 unsigned int num=10;比如年龄。
typedef-类型定义
typedef unsigned int uint;
//定义一个类型的不同叫法
int main()
{
unsigned int num=10;
uint num2=20;//uint时unsigned int的别名
return 0;
}
static关键字
1、static修饰局部变量
每次进去test函数,局部变量a会重新定义,因为局部变量所能使用的范围为所在的局部范围,当第一次进去test到结束test时,a已经被销毁。
仔细看上面代码,在局部变量a前面加了static关键字,代码结果发生了变化,static可以修饰局部变量,static修饰局部变量时,改变了他的生命周期(变长),和程序的生命周期一样了
2、static修饰全局变量
改变了这个全局变量的作用域,这个变量只能在自己所在的源文件使用
3、static修饰函数
改变了这个函数的使用范围,这个函数只能在自己所在的源文件内部使用,不能在其他源文件内部使用,static修饰全局变量,使得这个全局变量只能在自己所在的源文件内部使用,
其他源文件不能使用,限制了extern
全局变量,在其他源文件内部可以被使用,是因为全局变量具有外部链接属性
但是被static修饰之后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了
//test.c中的代码
//声明外部函数
extern int Add(int x,int y);
int main()
{
int a=10;
int b=20;
int sum=Add(a,b);
printf("sum=%d\n",sum);
return 0;
}
//test.2c中的代码
int Add(int x,int y)
{
return x+y;
}
当加入static时,如下图,会报错,static改变了这个函数的使用范围,这个函数只能在自己所在的源文件内部使用,不能在其他源文件内部使用