一、数据类型
char: 1个字节 ;8个bit ;[-128,127]
unsigned char: 1个字节 ;8个bit ;[0,255]
short: 2个字节 ;16个bit ;[-32768,32767]
unsigned short: 2个字节 ;16个bit ;[0,65535]
int: 4个字节 ;32个bit ;[-2^31 -1,2^31-1]
unsigned int: 4个字节 ;32个bit ;[0,2^32-1]
long: **4/8个字节** ;32/64个bit ;[-2^63-1,2^63-1]
long long: 8个字节
floar : 4个字节;32个bit;(1符号位11指数位23尾数位)最大值:3.4*10^38; 小数点后精确6位 6-7
double:8个字节;64个bit;(1符号位11指数位23尾数位)最大值:1.79*10^308;小数点后精确12位 15-16
double
long double 12个字节;
**浮点数类型中的 0 表示的是一个范围 而不是真正意义上的零 例如 float中 0表示(-0.0000001,0.0000001)**
二、进制
int 类型
最大值 :0(31个1)最小值 :1 (31个0)
0 :32个0
-1:32个1
三、操作符 运算符
1.类型混合运算自动扩充
char->short->int->long->float->double
signed + unsigned ==> unsigned
2.关系运算符中
**没有a==b==c这种情况
只有a==b&&b==c**
3.在逻辑运算符中
**会出现短路特性**
**假&&表达式 恒为假 后面表达式的结果无论是真或者假都无法改变整个逻辑表达式的结果,后面表达式将不再进行运算 这种现象称为短路特性
真||表达式 恒为真
表达式不能影响结果,所以不再进行运算**
例如 a = 0,b = 0
++a>0 || b++>0
执行完语句 a = 1 b = 0
&& 结合性优先级 高于 ||
int a=1,b=1,c=1
int x = ++a>1||++b>1&&++c>1
++a>1||(++b>1&&++c>1)
4.位运算
0 & 任意值 = 0
1 | 任意值 = 1
右移 >>
右边移出的位舍弃 如果是有符号(signed)的数 补符号位
如果是无符号(unsigned)的数 补0
除了负的奇数 每向右移一位 相当于除以2
左移 <<
左边移出的位舍弃 右边补0
每向左移一位 相当于乘以2
算术优先级高于 移位运算符
234>>1+3 ==> 234>>(1+3) ==> 234>>4
四、语句
1.if注意事项:
如果分支语句只有一条语句时 可以省略{}
但是不建议省略
if(condition);{
//无论什么情况都会执行
}
if(condition); 表示if分支语句为空 ==> if(condition){;}
分号表示语句结束
2.循环语句
for(;;) 括号中分号不能少 不管有没有语句
如果有多个变量时可以用逗号隔开for for(i=1,j=0;i<10&&j<10;i++,j++){}
for(;;){} 无限循环
for(;x;) 省略{} 表示只有一条语句是循环体的语句
for(x;x;x); 表示循环体语句为
for(x;x;x);{
//只执行一次 当循环执行完成之后 不属性循环
}
for(int i=0;;) 在初始化循环变量时 可以直接定义变量
但需要在 c99 gnu99模式下才被允许
gcc -std=c99
五、数组
数组名[下标];
下标:
从0开始到数组长度减1
**注意:下标是从0开始,且最大值不能取到数组长度
数组下标不能越界**
数组越界访问可能造成逻辑错误 也可以访问错误的数组
最严重的后果是程序崩溃
下标是从0开始且连续,所以很多时候都会结果循环使用
**可变长数组
数据类型 数组名[变量];
int n = 0;
scanf("%d",&n);
int arr[n];
注意: 可变长数组不能直接初始化 不能 = {}这种形式初始化
必须用循环的形式进行初始化
for(i=0;i<n;i++){
arr[i] = 0;
}**