学习笔记——C语言基本概念&编译预处理——(11)

预处理相关命令

1、头文件包含

        #include<xxx.h>;去系统默认路径下找该.h文件。

        #include“xxx.h”;现在当前路劲下找.h文件,找不到再去默认路径下找该.h文件

2、宏定义

格式1:#define PI        3.1415926

特点为原样替换,对计算机而言:在预处理阶段,用宏体替换宏名;

举例:
#define P_INT    int*

那么P_INT a,b,其中a的数据类型是:int*,b的是int。

补充

typedef

功能:类型重定义,给数据类型起别名

格式:typedef 原来的数据类型, 新的名字

struct Tag{
成员;
};
typedef struct tag Tag;
Tag num; num: truct tag
举例: typedef int * P_INT;
P_INT a,b;
a的数据类型:int*
b的数据类型:int*

格式2:#define 宏明

        #define NUM 定义该宏, 叫 NUM
一般和下边的配合用:
#define NUM 定义一个宏: 叫 NUM
#ifdef NUM 如果 NUM 这个宏已经被定义, 编译下面的
        代码片段
#endif


#define NUM 定义一个宏: 叫 NUM
#ifndef NUM 如果 NUM 这个宏没有被定义, 编译下面的
代码片段
#endif

预处理指令( 条件编译) :

指令说明
#空指令, 无任何效果
包含一个源代码文件
#define定义宏
#undef取消已定义的宏
#if如果给定条件为真, 则编译下面代码
#elif如果前面的#if 给定条件不为真, 当前条件为真, 则编译下面代码( 类似于 else if)
#else结合#if 使用, 类似 else
#ifdef如果宏已经定义, 则编译下面代码
#ifndef如果宏没有定义, 则编译下面代码
#endif结束一个#if……#else 条件编译块

3、关键字

全局变量:

生命周期:从定义处开始,到当前.c结束

作用范围:从定义处开始,到当前.c结束

extern

1-->extern修饰全局变量,表示借用外部的,外来的

        格式:extern数据类型,变量名;

        注意:定义的时候不能给变量赋值

2-->extern 修饰函数:借用外部的,外来的;

        格式:extern 函数声明;

        static

                方式 1: 修饰局部变量 延长生命周期
                方式 2: 修饰全局变量--私有化--不借
                方式 3: 修饰函数 -- 私有化 -- 仅在当前.c 中使用

4、模块化编程

        任意工程/项目, 有且仅有一个 main 函数, 程序执行一定是从 main 函数开始, 终止于 main 函
数;
        一个项目/工程: 通常有 1 个 main 函数, 和多个功能函数组成, 为了方便管理, 一般每个功能
会有一个单独的.c, 也会给每个.c 配备一个.h 文件;
        .c: 变量的定义, 函数的定义( 函数执行功能的过程)
        .h: 头文件包含, 宏定义, 数据类型的定义, 函数的声明, 枚举
.c 的格式:
        #include “自身的.h”
        函数的功能
.h 的格式:
        #ifndef 宏名 //如果该宏名没有被定义
        #define 宏名 //定义该宏
        。 。 。 。
        #endif //结束
        三行预处理指令的功能: 防止头文件, 重复编译。

5、位运算符

主要是针对二进制数的运算符:&|^<<>>~

数值 1 数值 2 &         |         ^( 结果)
1         1         1         1         0
1         0         0         1         1
0         1         0         1         1
0         0         0         0         0
已知数值 1, 已知结果, 求数值 2;
&0 清 0, &1 保持不变;
|1 置 1, |0 保持不变;
^1 取反, ^0 保持不变;

例 1: unsigned char num = 51; //0011 0011
期待经过某种操作, 第 4 位清 0, 其他位保持不变; //0010 0011
        num = num & 1110 1111
        1110 1111: ~( 0001 0000) == ~( 1<<4)
        num &= ~( 1<<4) ;
例 2: unsigned char num = 51; //0011 0011
        第三位置 1: 期待的结果 0011 1011
        num = num | 0000 1000 = 0011 1011
        num |=( 1<<3) ;
例 3: unsigned char num = 51; //0011 0011
        第五位取反: 期待的结果 0001 0011
        num = num ^ 0010 0000
        num ^= (1<<5);

总结:
        第 n 位清 0: num &= ~(1<<n);
        第 n 位置 1: num |= (1<<n);
        第 n 位取反: num ^= (1<<n)

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值