• 问题总会出现,不过解决问题的方法也会出现!!!

C语言基础学习笔记12

学习笔记 小雨 649次浏览 已收录 0个评论

—— ——-

2-#include指令

文件包含是C预处理程序的另一个重要功能

1、文件包含格式的命令:

#include “”包含的是一个用户自定义的文件,可以是头文件,也可是普通文件

  1. 在当前文件所在的路径下查找
  2. 如果上面没有找,到编译器include路径查找
  3. 如果编译器include路径下没有找到,系统的include路径下查找
  4. 如果上面三个都没有找到就报错了

#include < > 包含一个系统(编译器自带)的头文件

  1. 编译器include路径下查找
  2. 如果没有找到就系统include路径下查找
  3. 如果都没有找到就报错

当包含我们自己写的文件就是使用#include“”

当包含系统提供头文件的时候,就是用#include < >

注意:include语句之后不需要加“;”如:#include<stdio.h>

2、文件包含的实质:

文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。

include可以包含头文件,也可以包含文本文件。

include不一定非要写在第一行
C语言基础学习笔记12

 

3-#include文件搜索顺序

  1. 搜索顺序

用户自定义的头文件:当前文件夹—>编译器include—>系统include—>(如果找不到)报错

自己安装的clang编译器(Xcode4.2)路径:/usr/lib/clang/4.2/include

Xcode自带编译器:include:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/

Mac系统的include路径有:

/usr/include

/usr/local/include

如果没有这个目录,可参考如下:

通常这个问题是由于系统没有响应的开发环境引起的,不同于常用linux mac osx并没有直接提供开发环境,这大概是由于大部分并不需要开发环境,索性官方也不提供了,开发人员反正能自己配置。

解决办法很简单,可以安装xcode然后通过在菜单中点击安装command line tools来解决。

.apple develop中心提供了直接安装command line tools的方法:

xcode-select—install

安装完毕,再来查看/usr,就能看到熟悉的/usr/include了,里头已经包含了大部分常用的头文件了。

系统头文件搜索顺序:编译器include->系统include->(如果找不到)报错

文件包含注意事项:

include的时候,可以包含路径

C语言基础学习笔记12

Xcode的缓存:/Users/apple/Library/Developer/Xcode/DerivedData

C语言基础学习笔记12

4-C语言模块化编程概念

所谓模块化编程(多文件开发),就是多文件(.c文件)编程,一个.c文件和一个.h文件可以被称为一个模块。

在以下场景中会使用头文件:

  1. 通过头文件来调用库函数。

在很多场合,源代码不便(或不准)向用户公布,只需向用户提供头文件和二进制的库即可。用户需要按照头文件中的接口声明来调用库功能,而不关心接口怎么实现的。

  1. 多文件编译。

将稍大的项目分成几个文件实现,通过头文件将其他文件的函数声明引入到当前文件。

  1. 头文件能加强了类型安全检查。

如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

 

5-多文件开发实现及注意事项

  1. 多文件开发

C语言基础学习笔记12

  1. 多文件开发的注意事项
  2. 头文件中可以和C程序一样引用其它头文件,可以写预处理块,但不要写具体的语句。
  3. 可以声明函数,但不可以定义函数
  4. 可以声明常量,但不可以定义变量
  5. 可以“定义”一个宏函数。注意:宏函数很像函数,但却不是函数。其实还是一个申明。
  6. 结构的定义、自定义数据类型一般也放在头文件中。
  7. 多文件编程时,只能有一个文件包含main()函数,因为一个工程只能有一个入口函数。我们把包含main()函数的文件称为主函数。
  8. 为了更好的组织各个文件,一般情况下一个.c文件对应一个.h文件,并且文件名要相同,例如fun.c和fun.h
  9. 头文件要遵守幂等性原则,即可以包含相同的头文件,但效果与只包含一次相同。
  10. 防止重复包含的措施

 

6-计算机中的进制

  1. 计算机中的进制是一种计数的方式,数值的表示形式。
  2. 常见的进制

十进制、二进制、八进制、十六进制

  1. 进制数字进位方法

十进制:0、1、2、3、4、5、6、7、8、9逢十进一

二进制:0、1逢二进一

书写形式:需要以0b或者0B开头,比如0b101

八进制:0、1、2、3、4、5、6、7逢八进一

书写形式:在前面加个0,如:045

十六进制:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F逢十六进一

书写形式:在前面加个0x或者0X,比如:0x45

16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。

C语言基础学习笔记12

7-进制转换的要素

  1. 进制转换的要素

进制转换的3个基本要素:数位、基数和位权

数位:数位是指数码在一个数中所处的位置

7 6 5 4 3 2 1 0    数位

0 1 1 0 0 1 0 0    数码

C语言基础学习笔记12

基数:每个数位上所能使用的数码的个数(二进制取值0、1基数为2,十进制取值0-9基数为10)

C语言基础学习笔记12

位权:位权是指一个固定值,如:367  3*10^2  6*10^1  7*10^0

0*2^0+0*2^1+1*2^2+1*2^3+0*2^4+1*2^5+1*2^6+0*2^7=100

数码*基数^数位=位权 (转换十进制) 位权相加就是转换后的10进制数

  1. 常见的进制转换

转换:有的时候转换为人能识别的数制,要操作计算机写计算机能够使得的语言(二进制)

10—>2:除2取余法,把10进制数除以2,然后取得余数的序列,再倒序

2—>10:所有的位权相加101=1*2^0+0*2^1+1*2^2

2—>16:4合1法,整数部分从右向左4位结合成一位,小数部分从左向右结合1位,不足部分补0

16—>2:1拆4法,16进制的1位拆成二进制的4位

2—>8:3合1

8—>2:1拆3

10—>8:除8取余

8—>10:   8—>2—>10

16—>10: 16—>2—>10

8-2进制和10进制互转

1、10进制—>2进制

方法:整数部分采取“除2取余法”,小数部分采取“乘2取整法”,高位补0

将得到的余数倒序得到的序列就是二进制的表示形式

C语言基础学习笔记12

2、2进制—>10进制

C语言基础学习笔记12

9-2进制和16进制互转

1、2进制—>16进制

口诀:4合1,把一个二进制数,整数部分从右向左,4位合成1位

小数部分从左向右,4位合成1位

C语言基础学习笔记12

2、16进制—>2进制

将16进制的每一位拆成4位二进制位

C语言基础学习笔记12

10-机器数和真值

在计算机内部将正负号数字化后得到的数称为机器数,而在计算机外部用正负号表示的实际数值,称为机器数表示的真值

  1. 机器数

一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位放符号,正数为0,负数为1。

比如,十进制中的+3 ,计算机字长为8位,转换成二进制就是00000011。如果是-3 ,就是10000011 。那么,这里的00000011 和10000011 就是机器数。

  1. 真值

因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

11-原码反码补码概念及转换

  1. 基本概念

数据在计算机内部是以补码的形式储存的

数据分为有符号数和无符号数,

无符号数都为正数,由十进制直接转换到二进制直接存储(其实也是该十进制的补码)即可。

有符号数用在计算机内部是以补码的形式储存的。(正数的最高位是符号位0,负数的最高位是符号位1.对于正数:反码==补码==原码。对于负数:反码==除符号位意外的各位取反。补码=反码+1)

正数的首位地址为0,其原码是由十进制数转换到二进制数字

负数的首位地址为1,其原码后面的位也为10进制数转换过去的2进制数,都是用补码方式表示有符号数的。

(1)原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

[1111 1111 , 0111 1111]

[-127 , 127]

原码是人脑最容易理解和计算的表示方式.

(2)反码:

反码的表示方法是:

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.

简单说,由原码得反码机器数为正时,二者相同。负时,符号位(表示正负号的那一位)不变,其余数值位全部按位取反

(3)补码

补码的表示方法是:

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

简单说,正数时原补相同,负数时,符号位(表示正负号的那一位)不变,其余数值位全部按位取反后再加一。所以说,负数的补码就等于该数的反码加一。

2、-1在内存中存储细节

[-1] = [10000001]原 = [11111110]反 = [11111111]补

C语言基础学习笔记12

12-为什么要引入反码、补码?

首先,因为人脑可以知道第一位是符号位,在计算的时候我们会根据符号位,选择对真值取余的加减。(其值的概念在本文最开头)但是对于计算机,加减乘数已经是最基础的运算,要设计的尽量简单,计算机辨别“符号位“显然会让计算机的基础电路设计变得十分复杂!于是人们想出了将符号位也参与运算的方法。我们知道,根据运算法则减去一个正数等于加上一个负数,即:1-1=1+(-1)=0,所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了。

14-位运算符介绍(一)

位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。

C语言提供了6个操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。

  1. & 按位与

只有对应的两个二进制位均为1时,结果位才为1,否则为0 口诀:同为1为1

例如:9&13=9

1001

& 1101

1001

  1. | 按位或

只要对应的二个二进位有一个为1时,结果位就为1,否则为0

1001

|  1101

1101

  1. ^ 按位异或

当对应的二进制位相异(不相同)时,结果为1,否则为0

1001

^  1101

0100

(4)~取反

各二进位进行取反(0变1,1变0)

~9=-10

9的原码:0000 0000  0000 0000  0000 0000  0000 1001

反码:1111 1111  1111 1111  1111 1111  1111 0110 //-10

知道补码求原码:也是符号位不变,其他各位取反+1

1111 1111  1111 1111  1111 1111  1111 0110

取反

1000 0000  0000 0000  0000 0000  0000 1001

+1

1000 0000  0000 0000  0000 0000  0000 1010 //-10

15-位运算符介绍(二)

  1. 左移位运算符<<左移

各二进位全部左移n位,高位丢弃,低位补0

C语言基础学习笔记12

x<<n左移x的所有二进制位向左移动n位,移出位删掉,移进的位补零

左移注意:

  1. 左移可能会改变一个数的正负性
  2. 左移1位相当于*2

用途:快速计算一个数乘以2的n次方(8<<3等同于8*2^3)

2<<2==2*2

C语言基础学习笔记12

2、>>右移

各二进位全部右移n位,保持符号位不变

C语言基础学习笔记12

x>>n  x的所有二进制位向右移动n位,移出的位删掉,移进的位补符号位

  1. 右移不会改变一个数的符号

x右移n位就相当于除以2的n次方

  1. 用途:快速计算一个数除以2的n次方(8>>3 等同于8/2^3)

C语言基础学习笔记12

  1. 位运算技巧
  2. 任何数和1进行&操作,得到这个数的最低位

1001

& 0001

0001

  1. 想把某一位 ,置0

11111111

&  11111011

11111011

18-变量地址获取及存储原理

  1. 获取变量地址的方法

%p输出一个地址

定义在函数中变量我们称为局部变量

先分配字节地址大内存,然后分配字节地址小的内存

C语言基础学习笔记12

变量的首地址,是变量所占存储空间字节地址最小的那个地址

  1. 变量在内存中存储的原则

低位保存在低地址字节上,高位保存在高地址字节上

CPU能够识别存储单位就是字节

C语言基础学习笔记12

C语言基础学习笔记12


本博客内容既有转载自网络的内容,也有本作者原创内容,仅供学习与交流之用
如有侵权或者错误之处,请及时在下方留言!
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址