**
c语言的基础学习
**
-
基本数据类型
整型: short int long
浮点: float double
字符: char
unsigned:表示无符号的数
signed :有符号 默认就是有符号的char 1字节 8bit -128,127
unsigned char 1字节 8bit 0,255
short 2字节 16bit -32658,32767 -215,215 -1
unsigned short 2字节 16bit 0,65535
int 4字节 32bit -231,231 -1
unsigned int 4字字 32bit 0,2^32 -1
long 4/8字节 -263,263 -1
// windows下64位 8 以后做开发时不会直接使用long类型
long long 8字节
float 4字节 32bit(1符号8指数位23尾数位) 3.410^38
//小数点精确6位 6-7
double 8字节 64bit(1符号11指数位52尾数位) 1.7910^308
//小数点精确12位 15-16
long double 12字节 -
进制
二进制
十进制
八进制
十六进制
重要: 数据在内存中以补码形式存在
补码: 正数的补码 等于 原码
负数: 最高位是1(表示符号位 负数)
正数的二进制取反+1
先减1按位取反 -
变量
(1)变量的声明
数据类型 变量名;
变量必须先声明后使用
变量必须要有类型, 代表了内存区域的大小,存储数据的类型
在同一个作用域下,变量不能重复定义
变量本质上标识一块内存区域,操作变量操作内存区域的值
(2)变量的初始化
变量定义时如果不初始化,变量是一个随机值(垃圾值)
变量第一次赋值称为初始化 确切的值 可以避免一些错误
如果变量不知道用什么值初始化就用"零"
(3)变量名(标识符)规则
数字、字母、下划线组成
不能由数字开头
不能和C关键字冲突
无限长但是C89识别31个字符,C99能识别63个字符)
(4)变量的操作
取变量的值
给变量赋值
变量是左值:能放在=左边 可变的 -
格式输入输出
底层是二进制 但是按照指定的格式输入输出
格式输出
printf(格式字符串,数据列表);
格式占位符 %- m.n l|h X
-左对齐 m 域宽 n小数点后宽度 l长 h短
i/d u f g e x o p cs -
操作符 运算符
(1)算术运算符
+ - * / %
(1)越界(数据溢出)
(2)同类型数据计算结果类型不变
整数类型除法 相当于 整除(截取整数部分的结果)
(3)0不能作为除数 浮点类型除外 0.0
(4)% 取余 操作数不能是浮点数 编译通不过类型混合运算:自动扩充 char->short->int->long->float->double signed + unsigned ==> unsigned char->int 8bit扩充成32bit 24补char的最高位
(2)赋值运算符
=
混合赋值
+= -= *= /= %=
a += 20; ==> a = a+20; a/=3; a = a/3;
a =+ 20;(3)自增减运算符
++ - -
int z = x++; // z=x; x=x+1;
int z = ++x; // x=x+1; z=x;
前加加(减减) 先自增(减),然后再运算
后加加(减减) 先运算,然后再自增(减)
int y = x++ + ++x;
x = x++ + ++x;
(i)不要在同一个表达式中对同一个变量进行多次自增减运算
(ii)浮点类型数据可以进行++ - -,但很少用(4)关系运算符
> >= < <= == !=
>= 大于或者等于
=>
数学逻辑
重要: 关系表达式的结果是 1 或者 0
一个关系,两种情况 成立(真 1) 不成立(假 0)
注意:
(1) 关系表达式结合是从左往右 1<x<2 恒成立
(1<x)<2 (1<x) 的结果是0或者1 1<2 0<2 恒成立
在语言中 x<y<z 表达式编译不会报错
并且C语言不会编译成 y 在(x,z)中间
(x<y)<z 0<z 或者 1<z
(2) 一个=和两个=
判断是否相等 一定要有 两个 =
int x = 0;
if(x=0){
//永远不会执行
}
if(x0){}
if(x=v){
(v非0时执行)
}else{
v为0时执行
}
(3) i<jk<l > (i<j) == (k<l)
比较运算符优先级高于 判等 运算符
如果要行判断相等得加() i<(jk)<l(5)逻辑运算符
&& || !
逻辑表达式的结果是 1 或者 0
在C语言中表示真 和 假
假值: 0 (-0.0000001,0.0000001) NULL
真值: 非"零"
逻辑: 真 或者 假
&& 逻辑与 两者都成立才为真 而且
真&&真 真
真&&假 假
假&&真 假
假&&假 假|| 逻辑或 或者 只要满足其中之一即为真 真||真 真 真||假 真 假||真 真 假||假 假 ! 逻辑非 !真 假 !假 真 判断 x是否在 (1,10)区间 1<x<10是错误 1<x && x<10 ==> 如果 x>1 而且 x<10 成立 注意: (i) x>1 && x<10 关系运算符优先级高于逻辑运算符 逻辑运算符经常用于 连接 多个 关系表达式 (ii) 短路特性 假&&表达式 恒为假 后面表达式的结果无论是真或者假都无法改变整个逻辑表 达式的结果,后面表达式将不再进行运算 这种现象称为短路特性 真||表达式 恒为真 表达式不能影响结果,所以不再进行运算 (iii) && 结合性优先级 高于 || int a=1,b=1,c=1; int x = ++a>1||++b>1&&++c>1; ++a>1||(++b>1&&++c>1);
(6)位运算符
按位进行运算
& | ^ ~ >> <<
& 按位与
二进制0或者1
1&1 = 1
1&0 = 0
0&1 = 0
0&0 = 0
14&8 = 8
0000 111
0101001001010 num | 按位或 二进制位0或者1 1|1 = 1 1|0 = 1 0|1 = 1 0|0 = 0 14|8 = 14 0000 1110 0000 1000 ------------- 0000 1110 -15|12 1111 0001 -15 0000 1100 ---------- 1111 1101 = -3 10010101010 num 00000000000 ------------- 10010101010 num ^ 按位异或 异1 二进制位不同则为1 二进制位0或者1 1^1 = 0 1^0 = 1 0^1 = 1 0^0 = 0 14^8 = 6 0000 1110 0000 1000 ---------- 0000 0110 -15^12 = 1111 0001 0000 1100 ---------- 1111 1101 = -3 -7^9 = 1111 1001 0000 1001 ---------- 1111 0000 = -16 101000101 num 000000000 ^ ----------- 101000101 num 推论(整数): -1 & num == num 0 & num == 0 -1 | num == -1 0 | num == num 0 ^ num == num -1 ^ num == ~num == -(num+1) 负数补码: ~num+1 = -num; ~num = -num-1; ~num = -(num+1);
~ 按位取反
二进制位0或者1
~0 = 1
~1 = 0整数: ~0 = -1 ~-1 = 0 ~num = -(num+1); 负数求补码: ~num+1 = -num; ==> ~num = -(num+1); char c = 234; int x = ~c;// 21 unsigned char a = 234 int y = ~c;// -235
“>>” 右移
右边移出的位舍弃 如果是有符号(signed)的数 补符号位
如果是无符号(unsigned)的数 补0
除了负的奇数 每向右移一位 相当于除以2"<< " 左移
左边移出的位舍弃 右边补0
每向左移一位 相当于乘以2注意:
(i) 算术优先级高于 移位运算符
234>>1+3 ==> 234>>(1+3) ==> 234>>4嵌入式里最经典的问题:
把num从低到高 第3个二进制位 置1 其它的位不变
num = 0x4 | num;
num = 1<<2 | num;
把num第5个二进制位 置0 其它的位不变
num = ~(1<<4) & num;假设x和y都是正整数 求 (x&y)+((x^y)>>1) 两个人: 苹果和香蕉 x&y 求相同的二进制位 x^y 求二进制不同的位 >> 1 除以2
(7)条件运算符 三目运算符
?:
expr?expr1:expr2
expr1和expr2两个式子 只会执行其中之一
如果expr的结果为真 则取expr1的结果,否则取expr2的结果(8)sizeof
(i)运算符 不是函数
(ii) sizeof(操作数)
操作数可以是变量、数值、类型、表达式
(iii) 计算存储数据或者类型或者表达式的结果需要的字节数
(iv) 只关心类型 不计算表达式
(v) 对于类型 不能省略()
sizeof(long) 4/8
int i = 0;
sizeof(++i) i的值不变 ++i不会运行
sizeof(混合类型表达式) 宽度最大的字节类型的大小
浮点数字面值默认是double类型,如果要表示float的浮点字面值需要加f/F
sizeof(3.14+5/2);//8
sizeof(3.14f+5/2);//4
char a = 1,b = 2;
sizeof(a+b);//4 char在算术运算时扩充成int类型(9)其它
& 取址运算符 取得变量的地址
, 分隔作用 表示一条语句
() 优先级
[] 数组元素访问运算符
. 成员访问运算符
* 取值运算符
-> 结构体指针访问成员运算符() 来限定优先级