【C语言篇】☞ 1. 前言、基础
前言
- 什么是操作系统:操作系统是一种系统软件,用来管理计算机的软硬件资源。
- 主流操作系统:
移动便携式设备:Android、iOS、Windows Phone、Symbian(塞班)、Black Berry(黑莓) OS
PC个人电脑:Windows、Mac OS、Unix、Linux
- 什么是iOS:iOS是一款由苹果公司开发的移动操作系统(iOS运行在移动便携式设备上)
- 什么是iOS开发:就是开发运行在iOS系统上的应用或游戏软件,如:QQ、淘宝、愤怒的小鸟等。
- Mac OS文件系统:对文件进行管理的系统叫文件系统
UNIX常用命令:
查看命令的详细帮助: man 命令名 (比如要看看 ls 命令的详细用法,执行 man ls)
pwd (print work directory):打印当前目录(工作目录) 目录 == 文件夹
cd (change directory)
cd / 进入根目录
cd Users 进入用户目录
cd tarena 进入用户的主目录(Home Directory)
ls (list) :列出当前目录下的所有内容
ls -a //-a 即all,列出目录下的所有文件(包括以.开头的隐含文件)
ls -l //-l 列举文件的详细信息(文件名、权限、所有者、文件大小等)
mkdir 创建目录(文件夹)
touch 创建文件
who 显示当前用户名
clear 清屏
touch xxx.m 新建xxx.m文件
open xxx.m 打开xxx.m文件
在根目录下使用ls列出所有内容:
Applications 放所有的应用程序
Library 应用程序需要的其库等内容
Network 网络相关
System 系统相关
Users 用户的目录
常用目录或路径:
主目录(Home Directory):一个用户有一个自己的主目录,用户在此目录下拥有很高的权限。
/ 根目录(Root Directory):只有一个,代表整个硬盘
特殊路径: / 根路径 ./ 当前路径 ../ 上一级路径
Desktop 桌面
Documents 文稿
Downloads 下载
Library 其他
Movies 影片
Music 音乐
Pictures 图片
Public 公共目录
注意:按一下tab键,可以自动补齐指令名称、文件夹、文件夹名等。
C语言的特点
- 丰富的运算符
- 丰富的数据类型
- 可以直接操作硬件
- 高效的目标代码
- 可移植性好
C语言的用途
- 编写系统软件、图形处理、单片机程序、嵌入式系统开发甚至是用于科研
- 编写游戏外挂
- 编写android程序
- 编写iOS程序
C语言的编译器
- gcc GNU Compiler Collection(GNU编译器套件),GNU组织开发的开源免费的编译器。
( gcc 原名为 GNU C Compiler,只能处理C语言,后来GCC很快地扩展,也可以处理C++、Objective-C、Java等其它语言)
- clang 开源的BSD协议的基于LLVM的编译器;苹果公司自己的编译器。
(LLVM可以作为多种语言编译器的后台来使用,前端用clang)
C语言的版本问题
- 1983年美国国家标准局(American National Standards Institute,简称ANSI)成立了一个委员会,开始制定C语言标准的工作
- 1989年C语言标准被批准,这个版本的C语言标准通常被称为ANSI C
- 1999年,国际标准化组织ISO又对C语言标准进行修订,在基本保留原C语言特征的基础上,针对应该的需要,增加了一些功能,命名为C99
- 2011年12月8日,ISO正式公布C语言新的国际标准草案:C11
C语言的官方标准
- ANSI C / C89标准:1989年,美国国家标准协会(ANSI)发布了第一个官方标准(简称 C89标准 或 ANSI C)。
- C99标准:1999年,国际标准化组织(ISO)和国际电工委员会(IEC)发布了C语言的新标准。
- C11标准:2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C语言的新标准。
C语言程序的运行过程
一、编译:编译是由编译器来执行的,主要做的时语法检查工作;将C源程序翻译成计算机能识别的0和1。
- 使用什么编译器:Xcode3使用GCC,Xcode4使用LLVM编译器(前端用clang)
- 如何使用clang编译器编译程序:
- 在终端中输入:cc –c 文件名.c
- 编译成功,会生成.o目标文件
- 编译器的错误和警告功能
- 如果代码有语法问题,编译器会直接报错。并指出错误的个数和具体行号。
- 只要有1个错误,程序就不能编译成功,也不会生成.o文件
- 警告信息只是编译器的一些建议,并不影响编译通过
二、链接:将自己编译好的.o目标文件和C程序库函数组合在一起,生成可执行文件。
由链接器完成,clang编译器里面已经包含了链接指令
- 在终端中输入:cc 文件名.o
- 链接成功,会生成a.out可执行文件
三、运行:两种运行方式:
- 直接双击打开a.out文件
- 终端中使用 ./a.out 指令
修改文件内容之后,一定要重新编译、链接,再运行。
其他clang指令:
- 修改可执行文件a.out的名称:cc xxx.o -o 新文件名
- 一起编译、链接:cc xxx.c
整个程序的运行过程:编写源程序==>预处理==>编译器==>连接器==>可执行
注意:gcc可换为clang(CC); gcc -E test.c 查看编译前文件内容 (-E的意思是:做预处理)
- 预处理:gcc -E test.c -o test.i (预处理的结果可以用-o的方式保存到一个文件test.i中)
- 编译:gcc -c test.i //编译成功,会生成.o目标文件; 1,2可以合并:gcc -c test.c
- 连接:gcc test.o
- 执行:./a.out
- 简写:gcc test.c (1,2,3的合并)
- 执行:./a.out
用Xcode创建项目
- Product Name:产品名称
- Organization Name:公司名称
- Company Identifier :公司唯一标识,一般为公司官网网址的倒序
- Bundle Identifier:产品唯一标识
- Type(Language):项目语言类型
C语言程序是由函数构成的,C程序的入口是main函数。函数内部代码的执行顺序,是从上到下执行的,如瀑布一样。
错误类型:
- 语法错误:编译器会直接报错
- 逻辑错误:没有语法错误,只不过运行结果不正确
关键字
C语言程序是由英文单词构成的,其中有些单词被C语言赋予了特殊含义,那么这些单词就是关键字。
C语言的系统保留字(32个关键字)
- 基本数据类型(5个):void、int、float、double、char
- void:声明函数无返回值或无参数,声明无类型指针,显示丢弃运算结果
- int:整型数据,通常为编译器指定的机器字长
- float:单精度浮点型数据,属于浮点数据的一种
- double:双精度浮点型数据,属于浮点数据的一种
- char:字符型类型数据,属于整型数据的一种
- 类型修饰关键字(4个):short、long、signed、unsigned
- short:修饰int,短整型数据,可以省略被修饰的int
- long:修饰int,长整型数据,可以省略被修饰的int
- singed:修饰整型数据,有符号数据类型
- unsigned:修饰整型数据,无符号数据类型
- 复杂类型关键字(5个):struct、union、enum、typedef、sizeof
- struct:结构体声明
- union:共用体声明
- enum:枚举声明
- typedef:声明类型别名
- sizeof:得到特定类型或特定类型变量的大小
- 存储级别关键字(6个):auto、static、register、extern、const、volatile
- auto:指定为自动变量,由编译器自动分配及释放,通常在栈上分配空间;修饰局部变量,默认省略不写
- static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
- register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
- extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义
- const:与volatile合称“cv'特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
- volatile:与cost合称“cv特性”,指定变量的值有可能会被系统或其他线程/进程改变,强制编译器每次从内存中取得该变量的值
- 流程控制关键字(12个)
- 跳转结构(4个):return、continue、break、goto
- return:用在函数体中,返回特定值(或void值,即不返回值),作用:结束函数
- continue:结束当前循环,开始下一轮循环
- break:跳出当前循环或switch结构
- goto:无条件跳转语句
- 分支结构(5个):if、else、switch、case、default
- if:条件语句,后面不需要放分号
- else:条件语句否定分支(与if连用)
- switch:开关语句(多重分支语句)
- case:开关语句中的分支标记
- default:开关语句中的“其他”分支,可选
- 循环结构(3个):for、do、while
for:for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2…循环,其中2为循环条件
do:do循环结构,do 1 while(2);的执行顺序是1->2->1…循环,2为循环条件
while:while循环结构,while(1)2;的执行顺序是1->2->1…循环,1为循环条件
标识符
标示符就是程序员自己在程序中起的一些名字。(常见的是:变量的名称和函数的名称)
- 命名规则:(一定要遵守)
- 只能由26个英文字母的大小写、10个阿拉伯数字0~9、下划线_组成
- 严格区分大小写,比如test和Test是2个不同的标识符
- 不能以数字开头
- 不可以使用关键字作为标识符
- 命名规范:(最好要遵守)
- 尽量起个有意义的名称,一般用英文单词,注意长度适中,可读性要强。
- 如果标识符中含有多个单词,可以使用驼峰标识(除开第一个单词,后面每个单词的首字母都是大写):
- firstName、myFirstName,或者使用下划线_来连接:first_name、my_first_name
- 一般情况下,
- 变量名:每个单词首字母大写;
-
函数(方法):第一个单词的首字母小写,其它单词的首字母都大写。
(如:UserName PassWord showMessage isPrint)
数据
- 静态数据:是指一些永久性的数据,一般存储在硬盘中。
- 动态数据:是指在程序运行过程中,动态产生的临时数据,一般存储在内存中。
- 当运行某个程序(软件)时,整个程序就会被加载到内存中,在程序运行过程中,会产生各种各样的临时数据,这些临时数据都是存储在内存中的。当程序停止运行或者计算机被强制关闭时,这个程序产生的所有临时数据都会被清除。
- 你可能会问:既然硬盘的存储空间这么大,为何不把所有的应用程序加载到硬盘中去执行呢?有个主要原因是内存的访问速度比硬盘快N倍。
- 数据的转换
- 静态数据到动态数据的转换(也就是从磁盘加载到内存)
- 动态数据到静态数据的转换
- 如:手机拍照片存储到手机的硬盘上
- 数据的大小
- 不管是静态还是动态数据,都是0和1组成的。
- 数据都有大小,静态数据就会占用硬盘的空间,动态数据就占用内存的空间
- 数据越大,包含的0和1就越多,比特位和字节
- 计量单位:
1 B = 8 bit
1 KB = 1024 B, 1 MB = 1024 KB
1 GB = 1024 MB, 1 TB = 1024 GB
变量
- 概念
是内存中的一片空间。用来保存程序运行期间的临时数据。
有名字,有类型
有名字,就可以重复使用
变量的类型决定着变量占用多大的内存空间。
- 声明(定义)变量
int x; 定义一个int类型的,名字叫x的变量
- 变量的初始化
第一次给变量叫初始化
最好不要使用没有初始化过的变量
#include <stdio.h> int main() { int x;//x是变量名,int是变量的类型 printf("x=%d\n", x); //x=1606422582,垃圾数据 x = 10; //将10保存到x中,第一次赋值相当于初始化 x = 20; //将20保存到x中,以后就叫给变量赋值 int y = 30;//定义变量的同时初始化 printf("y=%d\n", y); return 0; } |
变量的类型
分两种:基本类型, 自定义类型
- 基本类型
整形:
有符号:可以是正数,也可以是负数。
int // signed int
short int 短整形
long int 长整形
long long int
无符号:只能是正数,不能是负数
unsigned int
unsigned short int
unsigned long int
unsigned long long int
特殊整形:
char
unsigned char
浮点型:全部是有符号
float
double
long double
- 自定义类型: struct, union, enum
- 数据的保存(二进制)
1Byte = 8bit
1KB = 1024Byte
1MB = 1024KB
…
- 类型的区别
short int 2Bytes 16bit
int 4Bytes 32bits
long int 8Bytes 64bit(64位系统) 4Bytes(32位系统)
long long int 16Bytes
占用内存空间多,表示的数据的范围就广
注意:int类型前面有其它修饰时,int可以省略。
bool 表示布尔运算,只包含true和false两个数值。需要在文件中加入如下语句: #include <stdbool.h>
数据类型
对应内存区域,其值可变,变量有相应的类型和值。
变量类型分为字符型char、整数型int、浮点型float/double、指针、结构、联合等类型。
#include <stdio.h> int main() { float f=3.14; printf("f=%f\n", f);//f=3.140000 double d=1.73; printf("d=%lf\n", d);//d=1.730000;默认都打印6位小数 printf("f=%.2f\n", f);//保留两位小数 printf("sizeof(float)=%ld\n", sizeof(float)); //表示数据的范围很大,内部使用了科学计数法来表示 //3.14:3.14×10^0 //0.00314:3.14×10^-3 //省略无意义0 f=.314;//f=0.314000 f=3.;//f=3.000000 f=3.14E-3;//3.14×10^-3; printf("f=%f\n", f);//f=0.003140
f=3.14F;//float类型的字面值后面加f,F f=3.14f; f=0x314F;//F代表十六进制的F return 0; } |