C语言之基本编程思想与基本概念扫盲
前言:C语言是包含了很多编程的基本思想,理解C能够有助于理解其他高级语言,深刻理解编程很多基本思想;这对新手入门是有很多好处的,正所谓磨刀不误砍柴工,内功与基础修炼扎实了,才能开始盖高楼大厦。 这篇文字作为读书笔记摘录了C Primer Plus这本经典C语言的内容,便于知识复习与分享。推荐书籍《C Primer Plus》
第1章 初识C语言
1.1 C语言的起源
为程序员设计开发的语言,有用的语言,程序员使用的一种编程工具。
1.2
选择C语言的理由
设计特性:自顶向下的规划、结构化编程、模块化设计;
高效性:运行速度快,微调控能力(汇编语言才具有的能力);
可移植性:许多计算机体系结构都可以用C编译器;可移植语言;
强大而灵活:
C编译器的作用:就是把C语言代码转换成计算机内部指令的程序。
可移植性:不同的硬件,使用不同的机器语言,由于架构体系的不同。
汇编语言:是为特殊的中央处理单元CPU,设计的一系列内部指令,使用助记符表示。
面向程序员:许多任务用C来处理都非常简洁,但是反面就是会容易犯莫名其妙的错误;
缺点:自由,但是必须承担更多的责任;自由就必须时刻保持警惕;大量运算符,可以编写出让人费解的代码;
1.3
C语言的应用范围
小型计算机(UNIX系统)、微型计算机(PC)、大型机(庞然大物);
C语言修改方便,移植到新型号的计算机中也没什么问题。
C++是C的超集,C++在C语言的基础上,嫁接了面向对象的编程工具。
面向对象编程是一门哲学!通过对语言的建模来适应问题,而不是对问题建模来适应语言。
嵌入式编程的流行语言:许多现代化设备的微处理器上
最重要的编程语言之一!
1.4
计算机能做什么
了解计算机的工作原理!
C语言编写程序与运行程序时发生的事情之间有什么联系?
、中央处理单元(CPU)承担大部分运算工作;2、随机存取内存(RAM)是存储程序和文件的工作区;3、永久内存存储设备(机械硬盘、固态硬盘);4、各种外围设备(键盘、鼠标、显示器等等);
CPU的工作过程:来概括就是,能够以惊人的速度从事枯燥的工作!工作过程简单来讲就是,从内存中获取一条指令并执行,然后再从内存中获取下一条指令并执行。CPU有自己的小工作区,由若干个寄存器构成。每个寄存器都可以存储一个数字。CPU能够理解的指令非常有限(这些指令的集合叫作指令集)。这些指令都相当具体。
有趣的知识:
存储在计算机中所有内容都是数字。计算机以数字的形式存储数字和字符(每个字符都有一个数字码),计算机载入寄存器中的指令也是以数字形式存储的。
计算机程序最终必须以数字指令码(机器语言)来表示。
计算机的工作原理就是,希望计算机做某事,就必须为其提供特殊的指令列表(程序
),必须用计算机能直接明白的语言创建程序。这是一项繁琐、乏味、费力的任务。
1.5
高级计算机语言和编译器
高级编程语言以多种方式简化了编程工作。首先,不必用数字码表示指令;其次,使用的指令更贴近你如何想这个问题,可以在更抽象的层次表达你的想法。
但是对计算机而言,高级指令就是一堆无法理解的无用数据。编译器在这个时候排上了用场。编译器是把高级语言程序翻译成计算机理解的机器语言指令集的程序。
程序员进行高级思维活动,编译器负责处理冗长乏味的细节工作。
不同CPU制造商使用的指令系统和编码格式不同。使用合适的编译器和编译器集,便可把一种高级语言程序转换成供不同类型CPU使用的机器语言程序。
高级语言以更抽象的方式描述行为,不受限与特定的CPU或指令集。高级语言简单易学,用高级语言编程比用机器语言编程容易得多。
1.6
语言标准
1.7
使用C语言的7个步骤
个步骤:1、定义程序的目标;2、设计程序;3、编写代码;4、编译;5、运行程序;6、测试和调试程序;7、维护和修改程序;
定义程序的目标:明确自己想做什么,需要哪些信息,要进行哪些计算和控制,程序要报告什么信息。这个过程不涉及具体的计算机语言,应该用一般术语来描述问题。
设计程序:对程序应该完成什么任务有概念性的认知后,应该思考如何用程序来完成它。用户界面应该是什么样的?如何组织程序?目标用户是谁?准备花多长时间来完成这个程序?如何表示数据,用什么方法处理数据,用一个合适的方式表示信息可以更容易地设计程序和处理数据。再次强调用一般术语来描述问题,而不是用具体代码。
编写代码:这个过程是真正使用C语言的地方,而且取决于编程环境。文本编辑器创建源代码文件,使用C的注释工具在源代码中加入对代码的解释。
编译:编译的细节取决于编程的环境。从概念的角度,讲解编译发生了什么事情。编译把源代码转换成可执行代码的程序。可执行代码是用计算机的机器语言表示的代码。不同的计算机使用不同的机器语言方案。编译器还会检查C语言程序是否有效。如果发现错误就不生成可执行文件并且报错,并生成错误信息或警告信息。
运行程序:
测试和调试程序:查找和修复程序错误的过程叫调试。
维护和修改代码
说明:养成先规划再动手编写代码的好习惯,用笔和纸记录下程序的目标和设计框架。这样在编写代码的过程中会更加得心应手、条例清晰。
1.8
编程机制源代码文件
目标代码(中间代码)-->目标代码文件,目标文件、中间文件
启动代码-->
库函数(目标代码)-->库文件 -->
C语言编写程序时,编写的内容被储存在文本文件中,该文件被称为源代码文件(source
code file),源代码文件以.c结尾。基本名.扩展名->这样的组合就是文件名。
C编程的基本策略是,用程序把源代码文件转换为可执行文件(可直接运行的机器语言代码)。C实现通过编译和链接两个步骤来完成这个过程。分而治之的方法方便对程序进行模块化。
过程:编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。可以独立编译单独模块,稍后再用链接器合并已编译的模块。如果只更改某个模块,不必因此重新编译其他模块。链接器还可以将已经编写的程序和预编译的库代码合并。
中间文件有多种形式。这里描述的是最普遍的一种形式,即把源代码转换为机器语言代码,并把结果放在目标代码文件中。目标文件(目标代码文件)存储的是编译器翻译的源代码,虽然目标文件中包含了机器语言代码,但并不能直接运行该文件,这还不是完整的程序。
目标代码文件缺乏启动代码。启动代码充当着程序和操作系统之间的接口。启动代码由于操作系统的不同而不同。
而且目标代码还缺少库函数。几乎所有的C程序都要使用C标准库中的函数。这些库函数真正的代码被存储在一个称为库的文件中。库文件中有许多函数的目标代码。
目标文件和可执行文件都是由机器语言指令组成的。目标文件只包含编译器为你编写的代码翻译的机器语言代码,可执行文件中还包含你编写的程序中使用的库函数和启动代码的机器代码。
有些系统中,编译器会自动启动链接器。用户只需要给出编译命令即可。
有些系统中,必须分别运行编译程序和链接程序。
1.8.1
Unix系统
可执行文件的扩展名.out
编译命令是cc
编译器会创建一个与源代码基本名相同的目标代码文件,扩展名是.o
但是一旦链接器生成了完整的可执行文件,就会删除.o目标代码文件。
如果原始程序有多个源代码文件,则保留目标代码文件。后面学到多文件程序时,这样做的好处你就会明白。
1.8.2
GNU编译器集合和LLVM项目
GNU项目始于1987年是一个开发大量免费UNIX软件的集合(GNU的意思是GNU’s
Not UNIX,即GNU不是UNIX)。
GNU编译器集合->即GCC,其中包含
GCC C编译器是该项目的产品之一。
GCC有各种版本以适应不同硬件平台和操作系统。用gcc命令便可以调用GCC
C编译器。许多使用gcc的系统都用cc作为gcc的别名。
LLVM 项目是与编译器相关的开源软件的集合。
各系统都使用cc别名来代替gcc或clang命令。
1.8.3
Linux系统
Linux是一个开源、流行、类似于UNIX操作系统,可在不同平台上(PC、MAC)上运行。准备C程序是,要使用GNU提供的GCC
公共域C编译器。
安装Linux时,可选择是否安装GCC,如果之前没有安装GCC,则必须安装。安装过程中会将cc作为gcc的别名。在命令行中使用cc来代替gcc。
1.8.4
PC的命令行编译器
C编译器不是标准Windows软件包的一部分,因此需要从别处获取并安装C编译器。可以从网上免费下载Cygwin和MinGW。这样可以再PC上通过命令行使用GCC编译器。
1.8.5
集成开发环境(Windows)
利用集成开发环境IDE可以快速开发C程序。IDE都内置了用于编写C程序的编辑器。
初次接触IDE环境可能令人望而生畏,因为它提供多个目标(target),即运行程序的多种环境。例如IDE提供了32位Windows程序,64位Windows程序,动态链接库DLL等。许多目标都涉及Windows图形界面。要管理这些选择,通常要先创建一个项目(project),以便稍后在其中添加待使用的源代码文件名。
1.9
小结
C是强大而简洁的编程语言。C语言更容易从一个系统移植到另一个系统。
C是编译型语言。C编译器和链接器把C语言源代码转换成可执行代码的程序。
C语言之基本编程思想与基本概念扫盲的更多相关文章
- C语言之通过冒泡排序浅谈编程思想
写这篇博文的目的是想起到抛砖引玉的作用,还请大牛们留下一些先进的思想,让小菜学习一下.下面入正题. 复习C语言怎么能少的了冒泡呢,记得刚学C语言那会,感觉冒泡排序真的太复杂了,理解不大了,嗯!还是当时 ...
- C语言编程思想
模块化的思想 模块化程序的特点:单入口.单出口 基本的三种结构:顺序.分支(选择).循环: 这三个基本结构来安排模块执行的步骤: 循环三要素:初值.条件.更新: 面对编程问题:三步走策略(输入+处理+ ...
- #Java编程思想笔记(一)——static
Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...
- [Java编程思想-学习笔记]第3章 操作符
3.1 更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...
- 16条Web2.0法则的编程思想
1.在你开始之前,先定一个简单的目标.无论你是一个Web 2.0应用的创建者还是用户,请清晰的构思你的目标.就像“我需要保存一个书签”或者“我准 备帮助人们创建可编辑的.共享的页面”这样的目标,让你保 ...
- Java编程思想——初始化与清理
PS:最近一直忙于项目开发..所以一直没有写博客..趁着空闲期间来一发.. 学习内容: 1.初始化 2.清理 1.初始化 虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了 ...
- 注解的基本盘点 -- 《Java编程思想》
注解(元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在之后的某一个时刻非常方便地使用这些数据. ---<Java编程思想> 其实注解可以理解为一个工具类,只要使用了这个工 ...
- Java程序员的日常——《编程思想》一切都是对象
今天终于看完了第一章,哈哈,万事开头难....刚开始被编程思想的第一章给蒙住了,讲一堆理论,没什么意思.从第二章开始,真正的开始讲解Java相关的内容,有了一定的开发经验后,再次阅读起来,感觉收获良多 ...
- 淡扯javascript编程思想
一.面向对象-OOD 虽然js面向对象的编程思想已经老话常谈了,但了为了文章的完整性,我还是把它加了进来,尽量以不太一样的方式讲述(虽然也没什么卵不一样的). 1.面向对象,首先得有类的概念,没有 ...
随机推荐
- oracle 在xml中批量插入,批量修改及多组条件查询
最近公司用ibatis开发项目,本来可以用存储过程处理批量插入,批量修改及多组条件查询:但由于使用模块相对较小,暂时就在xml中配置,以前没有在xml做过类似处理,有必要记录一下:好了,代码如下: & ...
- The Independent JPEG Group's JPEG software Android源码中 JPEG的ReadMe文件
The Independent JPEG Group's JPEG software========================================== README for rele ...
- android 获取sharedpreference的三种方法的区别
1. public SharedPreferences getPreferences (int mode) 通过Activity对象获取,获取的是本Activity私有的Preference,保存在系 ...
- codeforces 1064D 双端队列BFS
双端队列BFS解决的就是路径权值可能为0的图最短路问题,权值为0插入队头,否则插入队尾. 对于这个题,可以看作上下移动的路径的权值为0,左右移动权值为1,而且不能超过规定的步数. 直接广搜求覆盖的点的 ...
- go语言-工作区和gopath
工作区是放置Go源码文件的目录;一般情况下,Go源码文件都需要存放到工作区中;但是对于命令源码文件来说,这不是必须的. 每一个工作区的结构都类似下图所示:/home/hypermind/golib: ...
- ES6中变量的解析赋值的用途
变量的解构赋值用途很多. (1)交换变量的值 let x = 1; let y = 2; [x, y] = [y, x]; 上面代码交换变量x和y的值,这样的写法不仅简洁,而且易读,语义非常清晰. ( ...
- PDF的一些工具
PdfStreamDumper Pdftk 这里有一个链接,列出了很多pdf免费工具 https://en.wikipedia.org/wiki/Category:Free_PDF_software ...
- Mac OS X 安装教程
1)10.8.3 http://bbs.pcbeta.com/viewthread-1317754-1-1.html 2)10.9 http://blog.csdn.net/kissing_huo/a ...
- Luogu 3629 [APIO2010]巡逻
先考虑$k = 1$的情况,很明显每一条边都要被走两遍,而连成一个环之后,环上的每一条边都只要走一遍即可,所以我们使这个环的长度尽可能大,那么一棵树中最长的路径就是树的直径. 设直径的长度为$L$,答 ...
- Luogu 3586 [POI2015]LOG
考虑离散化后开权值线段树. 设序列中不小于$s$的数有$cnt$个,小于$s$的数的和为$sum$. 那么操作Z能成功的充要条件是$sum \geq (c - cnt) * s$. 如果序列中不小于$ ...