单目操作符
单: !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);
}