• 快速复习C语言


    变量与运算符

    本篇以读者知道 intcharfloatdouble 等数据类型为前提条件。

    float 类型注意事项

    float 类型数没有办法跟一个数真正比较是否相等,可以定义借助绝对值在一定误差范围内视为相同:

    if ( fabs(f-0) <= 1e-6)
    

    #define

    #define 的处理在程序的预处理阶段,占编译时间,不占运行时间。缺点是不检查语法,只是单纯的宏体与宏名之间的替换。

    用 define 定义宏函数:

    #define MAX(a,b)	
    		({ int A=a, B=b; ((A) > (B) ? (A) : (B)); })
    

    定义变量

    定义变量语法:[存储类型] 数据类型 标识符 = 值

    存储类型

    • auto:默认存储类型。

      • 不初始化则为乱值,不会自动初始化为 0 值或空值;
      • 自动分配空间,自动回收空间。
    • register:(建议型1)寄存器类型。

      • 只能用来定义局部变量,不能定义全局变量;
      • 大小有限制,只能定义 32 位大小的数据类型,如 double 类型就不可以;
      • 寄存器没有地址,所以一个寄存器类型的变量无法打印出地址进行查看或使用。

      1 建议型的意思是建议 gcc 分配为寄存器类型,至于是否分配为寄存器类型,由 gcc 自己做主,gcc 不会轻易把变量放入寄存器中

    • static:静态类型。可以修饰变量和函数,将变量或函数的作用域限制在当前文件中,外部文件无法引用。

      • 自动初始化为 0 值或空值;
      • 只使用同一块空间,所以值有继承性。
    • extern:说明型关键字。不能改变被说明的变量的类型或值。

    image-20200527004807335

    运算符

    • 算术运算符:+ - * / % ++ -- ……
    • 关系运算符:< <= == >= > !=
    • 逻辑运算符:&& || !
    • 位运算符:<< >> & | ^ ~
    • 赋值运算符:=
    • 条件运算符(三目运算符):? :
    • 逗号运算符:,
    • 指针运算符:* &
    • 单目运算符(判断数据类型长度):sizeof()
    • 强制类型转换:char int float double ……
    • 分量运算符:. ->
    • 下标(索引)运算符:[]
    • 其他:()

    位运算

    左移与右移

    << 左移 shl

    a << b,表示 a 的二进制数向左移动(在后面添 0)b 位

    例如:6 << 3

    (6)10 = (0110)2 向左移动三位变成 (0011 0000)2 = (48)10

    左移运算,相当于 a * 2b,即 6 << 3 = 6 * 23 = 6 * 8 = 48

    >> 右移 shr

    与左移相反,a >> b,表示 a 的二进制数向右移动 b 位

    例如:36 >> 2

    (36)10 = (0010 0100)2 向右移动两位变成 (0000 1001)2 = (9)10

    右移运算,相当于 a / 2b,即 36 >> 2 = 36 / 22 = 36 / 4 = 9

    & 与运算 and

    两个二进制数相同位的两个数字都为 1,则结果为 1;其中一个不为 1,则结果为 0

    例如:12 & 10

    (12)10 = (1100)2

    (10)10 = (1010)2

    结果为 (1000)2 = (8)10,即 12 & 10 = 8

    与运算可以判断一个整数的奇偶,把这个整数跟 1 进行与运算,结果为 0 则该数为偶,结果为 1 则该数为奇

    | 或运算 or

    两个二进制数相同位的两个数字有一个为 1,则结果为1;只有两个都不为 1,结果才为 0

    例如:10 | 6

    (10)10 = (1010)2

    (6)10 = (0110)2

    结果为 (1110)2 = (14)10,即 10 | 6 = 14

    ^ 异或运算 xor

    相同位两数不同则为 1,否则为 0

    例如:10 ^ 6

    (10)10 = (1010)2

    (6)10 = (0110)2

    结果为 (0010)2 = (2)10,即 10 ^ 6 = 2

    一个数进行两次相同的异或运算结果是它本身,由此可以通过异或运算交换两数:

    a = 11;
    b = 9;
    a = a ^ b;
    b = a ^ b;	// 相当于 b = (a ^ b) ^ b = a
    a = a ^ b;	// 相当于 a = (a ^ b) ^ a = b
    printf("a = %d, b = %d
    ", a, b);	// a = 9, b = 11
    

    分析:

    第一次 a = a ^ b = (11)10 ^ (9)10 = (1011)2 ^ (1001)2 = (0010)2 = (2)10

    第二次 b = a ^ b = (2)10 ^ (9)10 = (0010)2 ^ (1001)2 = (1011)2 = (11)10

    第三次 a = a ^ b = (11)10 ^ (2)10 = (1011)2 ^ (0010)2 = (1001)2 = (9)10

    ~ 取反运算 not

    将一个二进制数所有位全部取反。做此运算时需特别注意是否有符号位

    例如:~ (11)10 = ~ (1011)2 = (0100)2 = (4)10

    位运算常用运算

    • 将操作数中第 n 位置 1,其他位保持不变:num = num | 1 << n;
    • 将操作数中第 n 位置 0,其他位保持不变:num = num & ~(1 << n);
    • 测试第 n 位是 0 还是 1:if(num & 1 << n)
  • 相关阅读:
    对软件工程课程的期望
    自我介绍
    新目标
    课后作业-阅读任务-阅读笔记-4
    20150914-构建之法:现代软件工程-阅读笔记
    团队编程项目作业2-团队编程项目开发环境搭建过程
    团队编程项目作业2-团队编程项目设计文档
    个人-GIT使用方法
    结对编程项目作业2-结对编项目设计文档
    结对编程项目作业2-开发环境搭建过程
  • 原文地址:https://www.cnblogs.com/muyisir/p/13032890.html
Copyright © 2020-2023  润新知