c语言的基础学习

**

c语言的基础学习

**

  1. 基本数据类型
    整型: 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.79
    10^308
    //小数点精确12位 15-16
    long double 12字节

  2. 进制
    二进制
    十进制
    八进制
    十六进制
    重要: 数据在内存中以补码形式存在
    补码: 正数的补码 等于 原码
    负数: 最高位是1(表示符号位 负数)
    正数的二进制取反+1
    先减1按位取反

  3. 变量

    (1)变量的声明
    数据类型 变量名;
    变量必须先声明后使用
    变量必须要有类型, 代表了内存区域的大小,存储数据的类型
    在同一个作用域下,变量不能重复定义
    变量本质上标识一块内存区域,操作变量操作内存区域的值
    (2)变量的初始化
    变量定义时如果不初始化,变量是一个随机值(垃圾值)
    变量第一次赋值称为初始化 确切的值 可以避免一些错误
    如果变量不知道用什么值初始化就用"零"
    (3)变量名(标识符)规则
    数字、字母、下划线组成
    不能由数字开头
    不能和C关键字冲突
    无限长但是C89识别31个字符,C99能识别63个字符)
    (4)变量的操作
    取变量的值
    给变量赋值
    变量是左值:能放在=左边 可变的

  4. 格式输入输出

    底层是二进制 但是按照指定的格式输入输出
    格式输出
    printf(格式字符串,数据列表);
    格式占位符 %- m.n l|h X
    -左对齐 m 域宽 n小数点后宽度 l长 h短
    i/d u f g e x o p cs

  5. 操作符 运算符

    (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<j
    k<l > (i<j) == (k<l)
    比较运算符优先级高于 判等 运算符
    如果要行判断相等得加() i<(j
    k)<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)其它
    & 取址运算符 取得变量的地址
    , 分隔作用 表示一条语句
    () 优先级
    [] 数组元素访问运算符
    . 成员访问运算符
    * 取值运算符
    -> 结构体指针访问成员运算符

    () 来限定优先级
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值