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个字节。