1.单目操作符
1)! 逻辑反操作符
#include
int main()
{
int a = 10;
printf(“%d\n”, a);
printf(“%d\n”, !a);
return 0;
} //结果为10 0
因为在c语言中0代表假,非0代表真,10为非零,所以它的反为0.
2)+ 正值
3)- 负值
4)& 取地址符号
5)~ 按位取反
int main()
{
int a = 0; //4个字节,32个比特位
int b = ~a; //b是有符号的整形
printf(“%d\n”, b); //打印的是这个数的原码
return 0;
} //结果为-1
注:原码 反码 补码
正数的这三个码数相同;
负数:补码-1=反码反码取反为原码
代码推理过程:a=0–>0×32
取反 1×32
-11×31+0
取反 1+0×30+1
第一位表示符号,1为负号,0为正号,所以结果是-1。
6)sizeof 计算大小(以字节为单位)
2.前置++,后置++,前置–,后置–
1)前置++
先++,再使用
//结果为a=11 b=11
2)后置++
先使用,再++
int main()
{
int a = 10;
int b = a++;
printf(“a=%d\n b=%d\n”, a, b);
return 0;
} //结果为a=11 b=10
3)前置–
先–,再使用
//结果为 a=9 b=9
4)后置–
先使用,再–
//结果为 a=9 b=10
3.(类型)强制类型转换
int a=(int)3.14;//将double类型强制转换为int类型
4.关系操作符
>>=<<=
!= 用于测试不相等== 用于测试相等
5.逻辑操作符
&& 逻辑与(同为真,才为真,得1;有假,则为0.)
|| 逻辑或(有一个为真,则为真,得1.)
注:真为非0,假为0
int main()
{
int a = 0;
int b = 10;
int c = a && b;
printf(“c =%d\n”, c);
return 0;
} //结果为0
6.条件操作符(三目操作符)
exp1 ? exp2 :exp3
exp1为判断条件,真(1),则执行exp2,;假(0),则执行exp3。
7.逗号表达式
用逗号隔开
8.其他
.->&*
[] 下标引用操作符
() 函数调节操作符
9.常见关键字
auto(自动)doforreturnswithbreak(跳出循环)doublegotoshorttypeof(类型定义)caseelseifsignedunion(联合体/共用体)charenumintsizeofunsigned(无符号的)continueextern (引入外部符号)longstatic(静态的)void(无/空)defaultfloatregisterstruct(结构体关键字)rolatilewhile
注:关键字不能与变量起冲突
1)auto
int main()
{
auto int a = 10;
printf(“%d\n”, a);
return 0;
}
int = auto int ,平时auto是省略的,局部变量又称自动变量。
2)register
计算机的储存数据
常识:硬盘(500G/1T) 内存(4G/8G/16G) 高速缓存 寄存器
–>
访问速度越来越快,造价越来越高
int main()
{
register int a = 10;//建议把a定义为寄存器变量
}
3)signed
int定义的变量是有符号的
signed int
unsigned int 无符号的
4)typedef
类型定义-类型重定义
int main()
{
typedef unsigned int u_int;
unsigned int num = 20;
u_int num2 = 220;
printf(“nmu=%d\n nmu2=%d\n”,num , num2);
return 0;
} //结果为num=20 num=220
5)static
修饰局部变量,使局部变量的生命周期变长
void test()
{
int a = 1;
a++;
printf(“a = %d\n”, a);
return 0;
}
int main()
{
int i = 0;
while (i < 5)
{
test();
i++;
}
return 0;
} //结果为5个a=2
void test()
{
static int a = 1;
a++;
printf(“a = %d\n”, a);
return 0;
}
int main()
{
int i = 0;
while (i < 5)
{
test();
i++;
}
return 0;
} //结果为a=2 a=3 a=4 a=5 a=6
原因是第一中情况中的局部变量a在一轮后的生命周期结束,在第二次代码开始时a又变为1;而在第二种情况中a的生命周期被延长,所以a会不断加值,直至i为4时。
修饰全局变量,改变了变量的作用域–让静态的全局变量只能在自己所在的源文件内部使用,出了源文件就无法再使用了。
a.c文件中
int main()
{
extern int a;
printf(“a=%d\n”, a);
return 0;
}
b.c文件中
int a = 10;
执行a.c文件,结果为a=10.
将b.c文件变为statc int a = 10;
代码执行失败。
修饰函数,改变了函数的链接属性
a.c文件:
extern int Add(int, int);
int main()
{
int a = 10;
int b = 20;
int sum = Add(a, b);
printf(“sum=%d\n”, sum);
return 0;
}
b.c文件:
int Add(int x, int y)
{
int z = x + y;
return z;
}
a,c执行结果为sum=30;
若将b.c改为
static int Add(int x, int y)
{
int z = x + y;
return z;
}
则会报错。
6)define
定义标识符常量
#define MAX 100
定义宏–带参数
#define MAX(x , y) (x>y?x:y) //比较大小
与下面这个意义相同
int MAX(int x , int y)
{
if (x>y)
return x;
else
return y;
}
10.指针
首先要了解内存是怎么分配地址的。
内存的基本单位是字节,用字节来分格子。
int main()
{
int a = 10;
printf(“%p\n”, &a); //%p打印地址
return 0;
} // 执行结果为16进制:00000019C78FF634
int main()
{
int a = 10;
int* p = &a;
//有一种变量是用来存放地址的–指针变量,类型为int*
*p = 20; // * 解引用操作符
printf(“%d\n”, a);
return 0;
}//结果为20
注:1)指针所指的是首字节,即是首字节的地址编号。
2)无论是哪种数据类型,指针大小只和操作系统有关。
3)指针的大小在32位平台是4个字节,64位平台上是8个字节。