单目操作符

单: !a   - 负值  +正值  &取地址  sizeof 计算占存空间 ~ 二进制按位取反   

--(前置/后置) ++(前 置/后置) (类型)强制类型转换   

* 间接访问操作符(解引操作符)

int a=10;  //0--假  非0--真

printf("%d\n",a); //10

printf("%d\n",!a); //0

     1、sizeof(a); //sizeof 用来计算变量/类型所占空间的大小,单位为字节

对于数组:如int arr[3]={0}; sizeof(arr);----4*3=12

数组元素个数=数组总大小/每个元素的大小

=sizeof(arr)/sizeof(arr[0]);

2、~ 二进制按位取反

int a=0;//4个字节,32个bit  00000000000000000000000000000000

int b=~a; //b为有符号的整型  1111111111111111111111111111111111111 

由上可得,b为a的按位取反,符号位为1 为负数,

这时我们就要涉及到原码,反码,补码的知识

​原码  反码 补码  

   正数的原码、反码、补码相同

        负数补码: 原码取反 ---> 符号位(第一位 即最高位)不变 0正1负,

最后加1

只要是整数, 在内存中存储时,存的都是二进制的补码

打印/使用 时,使用的是原码

对于负数的原码(补码-1,然后符号位不变,其他位取反)

1111111111111111111111111111111111111 

1111111111111111111111111111111111110

1000000000000000000000000000000001 (-1)

即打印b时,输出-1

3、前置/后置++、-- 

int a=10;

int b=a++;  //先使用a给b赋值,再++(--)

printf("%d%d\n",a,b); //11,10


int a=10;

int b=++a;  //先++(--),再使用a给b赋值

printf("%d%d\n",a,b); //11,11

关系操作符

>=, >, <=, <, ==, !=

逻辑操作符

&&  逻辑与 (0为假,非0为真)只需判断符号两边是否为真

int a=10;

int b=3; 

int c=a&&b;

printf("%d\n",c);    //1

要与 & 区分开  &为按位与 

 ||  逻辑或

条件操作符

exp1 ? exp2:exp3;   //判断exp1是否为真,为真执行exp2,否则执行exp3

如 int c = (a > b ? a : b); //取最大值

等效于if语句

if(exp1)

exp2;

else

exp3;

逗号操作符

exp1,exp2,...,expN

如 int a=1,b=2;    char a,b,c;

下标引用、函数调用和结构成员

[ ]   数组里的下标引用 如arr[4]

( )   函数调用操作符  如之前定义的 add(x,y)

 .  ->  在结构体中会用(后面再展开)

常见关键字

auto   int a=10;(出作用域时,局部变量自动消除)等效于auto int a=10;

   所以局部变量也可称为自动变量,但在定义局部变量时,都省略掉了auto

case  break   const  continue  default do else  enum extern  return  sizeof

switch  int  char  float  long  short  signed  unsigned  double  while  goto void

register (设置建议将变量存到寄存器中)如 register int a=10; 只是一个建议,

到底a有没有存到寄存器中,由编译器判断决定。

(如果已存到寄存器中,后面a被多次访问,访问寄存器比较快)

计算机存储空间大小(从小到大):

寄存器<高速缓存<内存<硬盘

   而访问速度与空间大小相反:寄存器>高速缓存>内存>硬盘

  int 定义的变量是有符号的 等效于 signed int 只不过是将signed省略了

也可以定义无符号变量  unsigned int a=10;

static 用来修饰变量和函数

   1、修饰局部变量---静态局部变量

  局部变量值出了作用域后不会被销毁,其生命周期变长了

void f()

{

static int a=1;

a++;

printf("%d\n",a); //2,3,4,5,6

}

int main()

{

int i=0;

while(i<5)

{

f();

i++;

}

}

如果不加static a会被销毁,输出一直是2

   2、修饰全局变量---静态全局变量

改变全局变量的作用域,让静态的全局变量只能在其所在的源文件内进行使

,extern 会出错。

   3、修饰函数---静态函数(与静态全局变量一样)

改变了函数的链接属性:外部链接属性  变成  内部链接属性

声明外部函数  extern int add(int, int)

struct  结构体关键字

union  联合体/共用体

typedef  类型(重)定义     等类型名字较长时,可用typedef进行重命名(别名)

如 typedef unsigned int  u_int;

volatile

注意:变量名不能与关键字冲突

#define 定义常量和宏

定义宏:#define MAX(X,Y)  (X>Y?X:Y)

定义宏不用定义参数类型(与函数相似)

int main()

{

int a=1,b=2;

int c=MAX(a,b); //等效于int c=(a>b?a:b);

}