从零开始学C语言
从零开始学C语言
@阆苑祁寒
更新时间:2019-12-31
更新说明:此版本是最终版本。初始版本有关helloworld的内容调到了附录部分。
pdf版本下载链接:
写在前面:本文从一个初学者的角度,给出了对C语言的简单理解。最近一次更新调整了之前的叙述方式。
目录 |
|
Part1 |
从Hello World讲起 |
Part2 |
知识结构梳理 |
Part3 |
一路走来的习题 |
Part4 |
实践心得和疑难释义 |
Part5 |
结束语 |
Part6 |
附录 |
如有谬误,敬请指出!
Part1 从Hello World讲起
“C语言是一门计算机语言。”这表明:
(1)C语言是源于计算机的,通过C语言,可以接触到计算机的某些工作原理。
(2)C语言是一门语言,既有和汉语和英语等语言相似的特性,也有语言所必须的语法结构。
(3)C语言是计算机语言,可唯一解释性使得C语言有别于其他语言,反之,只要掌握了每一个语句的原理,很容易学好计算机语言。
要知道,想要学习好每一门学科,都必须了解其历史,这也是历史这门学科的主要价值。第一台计算机是美国宾夕法尼亚大学设计的用于弹道计算的ENIAC(英耐克),而与之密切的网络则是为了弥补单一通讯方式的不足而被发明。可见,计算机和网络都是随战争诞生的,以及运筹学(优化算法的理论基础)也是在二战期间应运而生。因此,认为战争催化科技发展这句话毫不为过。
简单了解ENIAC后,认识到其架构是具有时代局限性的,其程序和数据存储是分开的,数据通过类似于电话接线局的接线方式来连接对应的程序。这是相当麻烦的,以至于从事曼哈顿计划的冯·诺依曼,改进了计算机的架构,将程序和数据放在一起,这也是冯·诺依曼被公认为计算机之父的原因。相反,现代电话都是程控接线,这表明技术的发展也永远并不是单一领域的。
但是,这样的简化并不能适应大规模的运算。众所周知,计算机数据和程序的存储方式是二进制代码,用1和0分别代表数字电路中的开和关,也即布尔代数中真(true)和假(false),一个二进制位称为1 bit(比特),通常将8个二进制位称为1 Byte(字节),在内存作为一个存储空间。根据数理逻辑运算定义加和乘,就完成了传统计算机体系的构建。
必须指出,我们公认的计算机编码表ASCII表(American Standard Code for Information Interchange)就恰好有128=28个特殊字符(后被扩充到256个特殊字符),依次从0编号到127,对应1字节长度的二进制数字的十进制大小。
尽管将计算机架构中的数据存储和程序放在一起,已经大大提高了计算机的效率。但对于程序本身而言,常常会出现一行固定指令被重复使用多次的情形。因此考虑将其提炼为机器语言(汇编语言),进而再一次提高了计算机的效率。进一步,将重复出现的机器语言再一次提炼,就得到了高级语言。
第一门高级语言C语言,具有划时代的意义,它连接了计算机组成(硬件)和计算机程序(软件),这对于入门计算机学科是极好的。
不可否认,C语言并非十全十美。一方面,面向过程的灵活性(指针)常常会因为小小的错误而使整个程序乃至计算机崩溃(早期计算机内存并未设置程序与操作系统,以及不同程序之间的界限)。另一方面,尽管在函数和宏中初步体现了大规模程序开发的模块化思想和封装思想,但是例如C语言的函数不可互相嵌套等缺陷使得灵活性下降。除此之外,作为语言本身先于语法而出现的特性,决定了基于C语言的计算机语言的语法结构,在发展中必然是逐渐完善的。C语言一些看似不符合常理的语句,它们的出现就好解释了。
局部来说,针对不同的目的,新出现的计算机语言在C语言的基础上进行各自的改良。但从总体来说,计算机语言逐渐从面向过程到面向对象。程序的封装,使得计算机程序员只需要查阅参考手册相关包的使用说明,如无必要,不再去关注内部封装的算法本身,这也是作为工程学科的一个重要特点。这些后续发展而来的语言也就因此被称为面向对象的语言。
最后,包括C语言在内的诸多计算机语言,第一课与其说是认识计算机语言,不如说是认识最基本的语句Hello World里的所包含的全部信息及相关附录!在此之前,你的手头应该拥有一本C语言的教材,下面将一本讲得非常明晰的教材推荐给大家:
《C语言程序设计教程》·姜恒远·高等教育出版社
以下便是C语言的Hollow world程序(不止一种写法,但它是最为经典的):
#include < stdio.h> int main(void) { printf("Hello, world! /n"); return 0; } |
最初拿到这个程序时,除了几个类似于英文单词的记号,其余的内容,就像初学一门新的课程一样,其实大脑是一片空白的。也许好奇心驱使你稍稍改动这个程序,但更多的还是受改动范围的局限和因为报错而沮丧罢了。
下面对这个最基本的程序涉及到的基本语法列出如下:
☆ #include<stdio.h> 将标准输入输出的头文件,在编译时加载到源代码的头部。
☆ int main(void) 函数头的声明形式,声明了一个名为main的函数,返回值类型是int类型,形式参数是void空类型。需要指出,main函数是C语言的主函数,有且仅有一个。一方面,编译过程总是从主函数开始,再根据调用关系读取其他的函数;另一方面,同名的函数会造成编译冲突。
☆ {} 表示复合语句,常用在循环结构和函数体中,如果没有花括号,C语言默认只逐级向下读取一行,其余内容作为花括号(如果有)中的最大层级解释。需要注意,C语言不像Python,会受到缩进的影响,反过来,有一个标准的编程规范,对于C语言的学习相当重要。
☆ printf("Hello, world! /n"); 调用了头文件中的printf函数,输出字符串常量,’\n’作为转义字符表示换行。
☆ return 0; 函数返回值,相当于右花括号的作用,用于结束对应类型的函数。事实上,int类型的主函数有无返回值,对于编译成功与否没有影响。严格来说,对应数据类型的函数,必须要有对应数据类型的返回值。在初学时需要注意,返回值并不是输出在屏幕上的值,而是函数本身有了一个值,也就是如果在另一个函数(主调函数)中调用这个函数(被调函数),这个函数的返回值可以赋给一个变量或者输出。
红色字体的部分可以参考“函数”和“结构化程序设计”章节的内容,高亮字体的部分可以参考“数据结构”章节的内容,紫色字体的部分可以参考“基本运算和输入输出”章节的内容。
更多细节部分,可以参考主流C语言参考书自行补充完整。需要指出,ASCII表、优先级与结合级表、输入输出函数转换说明符表和常用转义字符表,是初学C语言时最为重要的四个表,应该作为工具经常使用。
其余更深入的内容,在学到对应的知识后将一目了然。此时,就没有必要去盲目补充了,与其沉溺于起点寸步不前,不如走向远方,等学有所成时再回头看起点,将恍然明悟,且获益匪浅!
Part2 知识结构梳理
从零开始学C语言的更多相关文章
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)
硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...
- 从零开始学 Java - 我放弃了 .NET ?
这不是一篇引起战争的文章 毫无疑问,我之前是一名在微软温暖怀抱下干了近三年的 .NET 开发者,为什么要牛(sha)X一样去搞 Java 呢?因为我喜欢 iOS 阿!哈哈,开个玩笑.其实,开始学 Ja ...
- 从零开始学 Java - CentOS 下安装 Nginx
早上下起了暴雨 闹钟还未响起就听到雨滴哗啦啦击打窗户的声音,被吵醒了.起床上班,在楼下的十字路口,暴雨大到完全看不清对面,两个穿着雨衣的交警站在路口中间指挥着过往的车辆,大家都慌慌张张.急急忙忙的打着 ...
- 从零开始学 Java - CentOS 安装 JDK
我来总结一下吧 昨天我写了一篇从零开始学 Java - 我放弃了 .NET ?,在园子里突然引起了强烈的讨论,有期待我能持续更新的.有鼓励支持的.有相同经历的.也有同一个学校的师兄弟(我们相认了).当 ...
- 从零开始学Bootstrap(3)
首先让我们回顾一下系列内容. 从零开始学Bootstrap(1)介绍了BootStrap最简单的模板,逐条解释了每行代码的含义. 从零开始学Bootstrap(2)强调了边学边做,通过实际的例子,讲解 ...
- 【原创】从零开始学SpagoBI5.X源码汉化编译
从零开始学SpagoBI5.X源码汉化编译 一.新建Tomact Server 服务器并配置测试1.文件-新建-其他-过滤server-服务类型选择Tomact V7.0 Server2.根据需要修改 ...
- 从零开始学数据分析,什么程度可以找到工作?( 内附20G、5000分钟数据分析工具教程大合集 )
从零开始学数据分析,什么程度可以找到工作?( 内附20G.5000分钟数据分析工具教程大合集 ) 我现在在Coursera上面学data science 中的R programming,过去很少接 ...
- 从零开始学 Web 系列教程
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新…… github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http:/ ...
- 从零开始学 Web 之 HTML(一)认识前端
大家好,这里是 Daotin 从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享 ...
随机推荐
- ztree实现复选框单选功能
/** * ztree的默认配置项 * */ var setting = { view: { selectedMulti: false //按住ctrl是否可以多选 }, check: { enabl ...
- 记录下vue 中引用echarts 出现 "TypeError: Cannot read property 'getAttribute' of undefined"问题
今天做项目,用echarts展示数据 ,自己测试 先测试 了下.写的代码html: <div ref="myChart" style="height:300px;w ...
- <Android Studio> 2.APP开机启动
开机启动,也就是App随着机器开机而启动,在很多工业场景中是非常常见的. 开机启动的基本原理就是监听系统启动相关的广播,然后启动App. 为了实现开机启动,我人为的分为几个步骤 1.创建broadca ...
- 记一次删除ocr与dbfile的恢复记录
自己造成的一个案例: 场景:ocr磁盘组被我dd掉了,dbfile磁盘组也被我dd掉了.Rac起不来.之前ocr的DATA磁盘组被替换到了ABC磁盘.所幸的是有备份. 重新加载OCR磁盘 [root@ ...
- idea 2019 集成activiti, idea activiti 新建bpmn文件, 解决idea activiti中文乱码
idea 在线安装activiti插件 1. File-->Settings 2. 点击Plugins, 右侧界面点击Marketplace后在搜索框搜索 actiBPM 注: 网络原因没有加载 ...
- java 使用网建SMS发送短信验证码
首先, 注册并登录网建用户, 新注册用户将获得5条的测试短信 网建短信通地址: http://sms.webchinese.cn/default.shtml 注册账号在此就不多做赘述了, 直接上代码 ...
- db.sqlite如何导出转储为sql文件
在使用 django框架写博客时,用的是sqlite数据库,想要将其中的db.sqlite转储为sql文件, 我是在linux下使用的,很多linux系统下都自带sqlite 检查是否安装sqlite ...
- AMD Ryzen一代、二代CPU一览表
Ryzen一代(14纳米).二代(12纳米)CPU一览表 http://img30.360buyimg.com/sku/jfs/t1/1134/23/12713/382299/5bd910f9E63b ...
- 目标检测论文解读10——DSSD
背景 SSD算法在检测小目标时精度并不高,本文是在在SSD的基础上做出一些改进,引入卷积层,能综合上下文信息,提高模型性能. 理解 Q1:DSSD和SSD的区别有哪些? (1)SSD是一层一层下采样, ...
- vs2017 curl7.6编译
nmake /f Makefile.vc mode=static VC=15 MACHINE=x86 nmake /f Makefile.vc mode=dll VC=15 MACHINE=x86 c ...