1、操作符
2、常见关键词
3、指针
1、操作符
sizeof 操作数的类型长度
#include<stdio.h>
int main()
{
int a=10;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof a);
printf("%d\n",sizeof(int));
//这是sizeof的三种输出方式
int arr[]={1,2,3,4,5,6,7,8,9,10};
printf("%d\n",sizeof(arr));
//在数组中,每个数字都有一个类型,数字的类型与变量的类型相同
//所以每一个数字的类型都是int,所以一个数字占4个字节,10个数字占40个字节。
return 0;
}
~ 对一个数的二进制按位取反
在二进制中1代表负,0代表正。
有符号的整形的二进制数的第一位是符号位,即+或-。
整数在内存中存储的都是补码。
原码是直接按照正负写出来的二进制序列
反码是原码的符号位不变,其他位取反得出的
补码是反码+1得到的。
正数的原码、反码、补码都相同
负数想要输出原码,需要由补码-1的到反码,反码除符号位其他位取反得到原码。
--前置、后置--
++前置、后置++
#inclde<stdio.h>
int main()
{
int a=10;
int b=--a;
int b=++a;
printf("a=%d,b=%d\n",a,b);
printf("a=%d,b=%d\n",a,b);
//--或++在前面时,先将a先-1或+1,再将a的值赋给b
int a1=10;
int b1=a1--;
int b1=a1++;
printf("a1=%d,b1=%d\n",a1,b1);
printf("a1=%d,b1=%d\n",a1,b1);
//--或++在前面时,先将a1的值赋给b1,a1再--或++。
return 0;
}
(类型)强制类型转换
#include<stdio.h>
int main()
{
int a=(int)3.14
//3.14属于双精度类型,在3.14的前面加上括号,括号中放上要改变的类型。
//3.14就被改成int类型了。
printf("%d\n",a);
return 0;
}
关系操作符
>,>=,<,<=,!=,==,
!=用于测试不相等
==用于测试相等
逻辑操作符
在C语言中,0代表假,非0代表真。
&& 逻辑与
#include<stdio.h>
int main()
{
int a=10;
int b=20;
int jg=a&&b;
printf("%d\n",jg)
return 0;
}
&&逻辑与的意思是:a是非0数吗?b也是非0数吗?如果都是非0数,输出1。如果某一方是0,那么输出0。
|| 逻辑或
#incldue<stdio.h>
int main()
{
int a=0;
int b=0;
int jg=a||b;
printf("%d\n",jg);
return 0;
}
||逻辑或的意思是:a和b两方中任意一方是非0数,就输出1。两方都是0,输出0。
条件操作符
exp1?exp2:exp3
这个操作符是一个三目操作符
#include<stdio.h>
int main()
{
int a=10;
int b=20;
int jg=(a>b?a:b);
//意思是a大于b吗?大于的话输出a,不是的话输出b。
return 0;
}
逗号表达式
exp1,exp2,exp3,…expN,
由逗号隔开的一串表达式就是表达式。
下标引用、函数调用和结构成员
[],(),·,->,
2、常见关键字
auto,break,case,char,const,continue,default,do,double,else,enum,extren,float,for,goto,if,int,long,register,teturn,short,signed,sizeof,static,struct,switch,stypedef,union,unsigned,void,volatile,while,
注:自定义变量名不可以和关键字相同
atuo 自动变量
#include<stdio.h>
int main()
{
auto int a=10;
printf("%d\n",a);
return 0;
}
当a在大括号中时生效,离开大括号时失效。所以在每个自动变量前都有一个auto表示这个局部变量是个自动变量,但是每个局部变量都有一个auto,所以就省略不显示了。
register 寄存器变量
#incldue<stdio.h>
int main()
{
register int a=10;
return 0;
}
register是用来向寄存器建议让此变量放在寄存器中,方便我们更快的调用这个变量。但是register是向寄存器建议,因为需要快速调用的变量太多了,需要有寄存器判断是否要放大寄存器中。
signed 定义有符号的变量
unsigned 定义无符号的变量
#include<stdio.h>
int main()
{
signed int a=-10;
unsigend int b=10;
return 0
}
signed可以输出正数或负数
unsigned只可以输出正数
typedef 类型重定义
类型重定义,说直白点就是类型增加了一个别名。使名字较长的类型拥有一个名字较小的别用,使我们调用它更方便快捷。
#include<stdio.h>
int mian()
{
typedef unsigned int=u_int;//这个别名需要自定义。
u_int a=10;
return 0;
}
static 静态
extern 声明外部函数
static 修饰局部变量
#include<stdio.h>
int test()
{
static int b=1;
b++;
pritf("%d\n",b);
}
int main()
{
int a=0;
while(a<5)
test();
a++;
return 0;
]
此代码的运算思路:首先在循环中判断a是否小于5,小于5时,进入test中。test中b=1生效,b+1,然后输出b。然后a+1,a变成1。继续重复在循环中判判断。但是在test中int a=1使用了static,使a的生命周期延长,当a离开大括号时将会继续保留,也就是当第二次循环开始a就变成了2。
改变了局部变量的生命周期,使生命周期延长,出了他的作用域也不会被销毁。
static 修饰全局变量
//文件1
#include<stdio.h>
int main()
{
extern a;
int b=a;
pintf("%d\n",b);
return 0;
}
改变了全局变量的作用域,使得全局变量只能在自己的源文件中使用。
static改变函数的链接属性
//文件1
#include<stdio.h>
int main()
{
extern add;
int a=10;
int b=10;
int jg=add(a,b);
printf("%d\n",jg);
}
//文件2
static int add(int x,int y)
{
int z=x+y
return z;
}
使用static使函数的链接属性由外部链接变成了内部链接,所以函数只能在自己的源文件中使用。
#define定义了常量和宏
#define定义了标识符常量
#inlcude<stdio.h>
#define b 100;
int main()
{
int a=b;
printf("%d\n",a);
return 0;
}
#define 定义了宏-带参数
注:使用宏时,宏名一般都是大写
#inclde<stdio.h>
#define JG(x,y)(x>y?x:y)
int main()
{
int a=10;
int b=20;
int jg=JG(a,b);
printf("%d\n",jg);
return 0;
}
3、指针
&取地址
*定义指针变量和解引用
指针变量是用来存放内存地址的
指针的类型需要和取地址的变量的类型相同
#include<stdio.h>
int main()
{
int a=10;
int*p=a;
*p=20;//解引用时不需要写任何类型
printf("%d\n",a);
return 0;
}
此代码计算思路:首先a在内存中拥有了一个位置,并且拥有了专属的地址。在这个地方中存放了数字10。其次p也在内存中拥有了一个位置,但是使用*,所以这个地方只能用来存放地址信息并且存放了a的地址信息。再次使用*在p的里面进行解引用,意思是数字20通过p中存放的a的地址信息,进入a的位置里,替换了10。
指针的大小
指针大小在32位平台是4个字节,64位平台是8个字节。