C语言程序设计概述

1 计算机体系结构

计算机主要由硬件和软件的协作完成生活和工作中的绝大多数事情,例如听音乐,看电影,上网聊天,购物等等。
硬件主要包含CPU,内存,外存,IO设备等组成。
CPU:负责从内存中读取进程的数据进行各种运算和控制其他设备 (输入输出设备)
内存:分为RAM(随机访问存储器)和ROM(只读存储器,例如BIOS),只是负责暂时存储数据,断电后数据会消失。
做程序开发时一般PC或者笔记本配置的内存为8-16G,而服务器的内存一般为64G。
外存:用于永久存储数据,常见的外存有机械硬盘和固态硬盘,其中固态硬盘的读写性能高于机械硬盘。
IO设备:主要是完成数据的输入输出,常见的IO设备包含鼠标键盘,声卡显卡等等。

软件的出现实现了人和计算机更好的交互
常见的系统软件包含运行于服务器端,基于命令行交互的Unix(Solaris11),Linux(RedHeat Enterprise 7).
运行于PC端,基于图形界面交互的Windows10(PC),Linux(Ubuntu16),MacOSX10.10。
运行于手机或者嵌入式设备,基于语音手势,体感交互的Android,IOS。Android是基于Linux内核发展而来,IOS是基于MacOSX衍生而来。
还有些运行在系统软件之上的应用软件,例如微信,支付宝,天猫,Office等等。
而系统软件底层都是采用C/C++编写的。

2 编程语言的发展历程

程序就是由指令系统加上数据集组成,而每个CPU都有自己的指令系统(由二进制的机器码01序列组成),PC上是X86指令系统,而手机上是ARM指令系统,这也就意味着PC上的程序不加修改不能直接到手机上运行,手机上的程序也是如此。这也就是最早的机器语言的由来,它的主要特点是高效,不能移植,可读性差,而且后期维护非常困难,想象一下要记那么多的机器指令是多么艰难的事情。
斗转星移,汇编语言和编译器的出现解决了需要记住非常多的机器指令的难题,但是还是没有从根本上解决移植性的问题,只是将机器指令转换为易懂的英文单词,然后由编译器编译成机器指令,因为计算机终归揭底智能识别0001110100110机器指令,而且汇编语言是面向及机器的,不同机器的汇编指令是不相同的。
这里的代码是演示Windows上将汇编语言嵌套在C语言中使用,完成两个变量相加的结果

void use_asm(){
    int a, b, c=0;
    a = 4;
    b = 6;
    printf("a = %d \t b=%d\tc=%d \n",a,b,c); 
    _asm{
        mov eax, a;
        add eax, b;
        mov c ,eax; 
    }
    printf("a = %d \t b=%d\tc=%d\n", a, b, c);
}
void main(){
    use_asm();
    getchar();
}

C语言是可以嵌套汇编语言使用
时光再流转,在1972年C语言的诞生,凭借着可移植性,和汇编差不多的高效以及无所不能的强大功能,引领了IT行业的发展,Unix,Windows,Linux都是采用C语言编写,但是它也存在着对平台库依赖比较严重,只有标准C的部分是可移植(所有的主流操作系统都实现了C语言的标准库函数)等缺点。而后期的C++,Java,C#等编程语言在很多方面都吸收了C语言的优点,新增了面向对象(OO)等诸多的特性,适合做应用开发。
主流操作系统Unix,Linux,MacOSX,Android和IOS底层实现都是采用C语言来实现的
现在流行的NoSQL产品Redis就是采用标准C开发的,而MongoDB是采用C++语言开发的。
而且还有一些特定领域的语言,例如Python,Go,Elang等等。
接下来看看运行在各大主流操作系统的C程序(Hello World),顺便简要介绍对应平台的集成开发环境(IDE)

3 Windows C程序设计

1 Windows C HelloWorld

开发工具: VisualStudio2013
运行环境: Windows7
编译器: CL(VisualStudio2013提供的C语言编译器)

这里定义了一个名为共通的头文件(common.h),头文件只是包含了函数的声明,包含了Windows平台最常用的几个头文件:
stdio表示标准C语言的IO处理
stdlib表示标准C语言的库函数
Windows表示Windows系统的系统函数

//导入共通的头文件
//#表示预处理,在预编译时执行 头文件中只是包含了函数的声明,函数的实现位于源文件中
#include <stdio.h> 
#include <stdlib.h> 
#include <Windows.h>
//Windows平台的C语言版HelloWorld
#include "common.h" //包含共同的头文件
/* * 第一个C语言程序 * C语言的程序若想编译并运行,必须声明 main方法(有且只能有一个,作为程序的主入口),具体如下。 * @author tony 18601767221@163.com * @date 2015/11/11 */
void main(){ //void 表示main函数返回值为空
    //这里的程序会从main函数的第一行执行到最后一行
    printf("Hello World In Windows7 \n"); // BUG :程序中可能会出错的地方 断点:F11测试程序一步一步执行,然后观察程序执行结果
    printf("Hello World In Windows7 again\n"); //每个语句以";"结束
    getchar(); //等待输入任意字符回车就退出程序
    /* C语言编译器不能识别中文符号,必须在英文状态下输入 VisualStudio2013运行时,解决方案的单个项目中只能有一个main程序,不然程序无法编译运行 */
}

头文件(.h):包含了函数的声明,就像字典的目录
源文件(.c):包含了函数的实现,就像字典的全书
C语言中的注释分为两种:
//:表示单行注释,注释的内容会被编译器忽略
/**/:表示多行注释,注释多行。开发中应该多写注释,说明代码的用途
关于VisualStudio2013的一些快捷键:
先介绍几个调试的快捷键吧,初接触C语言,可以使用IDE的调试功能来观察程序执行的过程
F5 :调试并运行,可以在指定代码的行号中添加断点来观察程序执行流程
F11:每次执行一行代码
F10:每次执行一个方法
Ctrl+Alt+F7:重新生成解决方案,也就相当于重新编译源代码

2 使用标准C库函数system完成Windows系统程序的命令调用

在主流操作系统中可以使用命令来完成许多功能,而在C语言中就可以使用位于stdlib(标准库)的头文件中的system函数完成各大操作系统的命令调用。

#include "common.h" //包含共同的头文件
/* * @author tony 18601767221@163.com * @date 2015/11/12 */

/* Windows系统下的常用系统程序命令 */
void command(){
    system("calc"); //打开计算器
    system("notepad"); //打开记事本
    system("stikynot"); //打开便签 该命令在cmd下可以打开便签,system函数无法调用成功
    system("appwiz.cpl"); //打开程序和功能
    system("firewall.cpl"); //打开防火墙
    system("explorer"); //打开资源管理器
    system("regedit"); //注册表
    system("shutdown -s -t 600"); //10分钟以后关机
    system("shutdown -a"); //取消关机
    system("desk.cpl");//屏幕分辨率
    system("taskmgr"); //任务管理器
}
/* 程序的主入口 */
void main(){ //void 表示main函数返回值为空
    command();
    getchar(); //等待输入任意字符退出程序
}

4 Linux C程序设计

开发工具: VIM
运行环境: Linux(RedHeat Enterprise 7)
编译器: gcc
系统说明:采用VMWare WorkStation 虚拟了一个Linux(RedHeat Enterprise 7),RedHeat Enterprise或者开源版CentOS7是最常用的企业版Linux,安装教程自己网上收罗吧。其实Windows也是一个虚拟机,只是它是宿主机。

1 Linux C HelloWorld

VIM是一个基于命令行的强大编辑器,这里说下简单使用
通常都是采用SSH工具连接远程的Linux服务器,推荐使用SecureCRT,配置主机名,用户和密码之后就能连接,默认端口为22.
在命令行下输入VIM helloworld.c,然后”i”进入编辑模式,输入如下代码

#include <stdio.h> //在Linux系统中也是有C语言的标准库函数
int main(){
    printf("Hello World In CentOS7\n");
    printf("Hello World In CentOS7 Again\n");
}

然后按下ESC,输入: wq即可编辑并保存完成在你登录之后的路径.然后使用gcc编译名为HelloWorld.c的源文件,gcc编译器有几个编译选项,借助这几个选项了解下Linux系统的C语言编译链接的过程。
C语言编译运行第一步-预编译:
将#include的头文件替换到源程序中,可以使用gcc -E HelloWorld.c -o HelloWorld.o 执行预编译,查看将头文件中的内容替换到源文件后的结果。
C语言编译运行第二步-转汇编:
操作系统都不认识C语言编写的源代码,必须转换成对应的汇编代码。可以使用gcc -S HelloWorld.s -o HelloWorld.c将源代码编译成汇编代码
C语言编译运行第三步-链接:
在生成汇编代码之后,将系统库文件以及启动代码链接组成二进制的可执行文件。可以使用gcc -o HelloWorld.o HelloWorld.c来完成编译和链接。

2 使用标准C库函数system完成Linux系统调用

#include <stdlib.h> // import stand libary head file
int main(){
    system("ps -a"); //show process list
    system("who am i"); // current loign user
    system("gedit"); // start gedit process
}

5. MacOSX C程序设计

开发工具: XCode6.4
运行环境: MacOSX10.10
编译工具:XCode自带的C语言编译器
系统说明:采用VMWare WorkStation虚拟一个MacOSX10.10操作系统并下载XCode6.4,需要解锁插件,具体过程网上搜罗。

1 MacOSX C HelloWorld

#include <stdio.h>
int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n"); //
    return 0; //返回整数0表示程序正常退出
}

在开发C/C++程序时还有一些跨平台的IDE,例如QT,CodeBlocks。在使用IDE开发大型项目时会提高开发效率以及降低后期的维护成本。

6 C语言最佳实践

1.C语言要想编译运行程序必须提供main函数,该函数定义了程序的入口,所有的代码从main函数第一行开始执行,到最后一行结束,其中Windows平台声明为如下格式:

void main(){
    //这里编写C语言代码
}

而Linux,Unix平台的声明格式如下:

int main(){
    //这里编写C语言代码
    return 0;
}

2 如果想使用一个C语言中的库函数,必须包含该声明函数所在的头文件。
3 C语言中的每个语句以;结束,并且严格区分大小写。
4 C语言是函数式的编程语言,为了实现模块化编程,可以把功能封装在各个函数中,然后在main函数中调用即可。
5 bat是Windows中的批处理文件,可以把它理解成为Windows平台的cmd,可以执行一系列的Windows命令。

建立一个名为open.bat的文件,内容如下所示,用于打开QQ和关闭QQ,双击运行即可实现

"C:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe" 
pause
taskkill /f /im QQ.exe

而且该功能可以使用C语言的system函数实现,如下所示。

#include <stdlib.h>
void main(){
    system("C:\\Users\\tony\\Desktop\\open.bat"); //执行位于桌面的open.bat文件
}

你可能感兴趣的:(C语言程序设计概述)