0X00 前言

最近准备填之前挖的那个写完TCPL(The C Programming Language, C程序设计语言)中所有练习题的坑,就顺便趁这个机会开始写这个系列的文章。写这个文章的时候计划是面向初学者,所以在很多概念上会进行一些举例解释。文章的内容和代码主要整理自TCPL,再加上我个人的一些理解和修改,所以此系列的结构大致按照TCPL的内容顺序,书中每一个章节对应一篇或多篇文章。对于C语言学习者,可以配合TCPL一起使用。除了TCPL的内容外,计划在后面整理一些关于新标准C99和C11的相关信息。

学习一门语言的最好途径就是通过编写程序练习,所以在学习的过程中肯定要安装好相应的软件。无论是初学者还是拥有多年经验的程序员,IDE(Integrated Development Environment, 集成开发环境)都是一个最佳的选择,它能极大地提高工作和学习的效率。适合编写C语言的IDE包括Microsoft家的神器Visual Studio、JetBrains家的CLion、OSX独有的XCode以及开源的Eclipse、Code:Blocks等。IDE有很多,而且很多都是开源或者有免费的社区版,可以选择一个自己喜欢的。除去IDE以外,文本编辑器也是一种选择,如VIM、Emacs、Sublime、Notepad++等。IDE一般都集成了编译器,或者可以调用其它已经安装的编译器,可以直接点击编译运行按钮运行程序。编译器就是一个能将编写完成的代码翻译成机器语言然后生成可执行文件(如Windows中常用的.exe文件)的程序,而编译就是翻译代码的过程。当然对于Linux用户以及打算深入学习的朋友,建议学习掌握通过命令行的方式编译运行程序。

0X01 第一个程序

开始的第一个程序是一个最简单的程序,也就是最经典的Hello World程序,它的功能为打印出Hello World。程序的内容非常简单,也是C语言编写程序的基本结构框架。下面就通过此程序开始介绍C语言。

#include <stdio.h>main() {printf("hello world\n");
}

0X02 程序解释

上面的程序就是Hello World程序的主要内容,接下来将解释每一条语句的用途。#include <stdio.h>是一个预处理指令,作用为让编译器在此程序中包含指定的头文件,在这个程序中为编译器将在程序中包含stdio.h文件,它的作用是在程序中包括标准输入/输出库信息。换一种说法解释,就是在程序中可能需要用到一些函数(关于函数的概念会在下面提到),但是这个函数并不是由我们编写代码实现的,而是别人写好给我们使用的。所以为了使用这些函数,就需要通过头文件包含进来。在这个例子中我们使用到了标准输入/输出库,标准输入/输出库是C标准库的一部分,它命名的规则为含义的缩写,即Standard Input and Output。对于C语言标准库,在这里可以暂时理解它是编译器实现者实现并提供给我们使用的一系列函数集合。关于头文件、标准库以及预处理指令的更多信息将在后续文章中再深入说明。

main()是一个名为main的函数,它是C语言中默认的入口函数,即在默认情况下运行程序时系统会先调用程序中的main函数。在不修改入口函数名称的情况下,一个完整的程序中main函数是必须的。main后面的()表示函数的参数列表,但在此例中没有用到参数,所以使用了空的参数列表()。函数使用一对{}将它的语句包括在其中,函数中的语句决定了函数的作用,它可能只有一行语句,也可能有成百上千行。在例子中,main函数只包含了一条语句printf("hello world\n");,将在下一段介绍它的作用。关于函数以及参数的具体内容将在文中后续部分继续介绍。

正如同上一段所说,main是一个函数,而printf也是一个函数。但是在这里不同于main,只是在使用printf,所以在写法上与实现main函数时有所区别。在实现main函数时使用了{}来包括它的语句,而调用printf而并非实现它,所以没有实现语句也就不需要使用{},而是使用了;代表这一行语句结束。在除了宏、使用了{}的语句等情况外,分号;都是必须的。printf函数的含义是格式化输出(Formatted Output),它来自于使用#include <stdio.h>包含进来的标准输入/输出库。在()中的就是要传递给printf函数的参数,在例子在中传递的是一个字符串"hello world\n"。在字符串中包含着一个\n,它是一个转义字符,称为换行符,作用如同名称为换行。在不包含\n的情况下,printf不会进行换行,所以一般在使用过程中我们会手动添加\n进行换行。在程序运行过程中,当printf函数运行后,就将会在屏幕上打印出hello world。

在C语言中,除去必要的空格外,空行和空格往往不是必须的,它的作用是为了提高代码的可读性。很多人可能会觉得这是多敲空格和换行是件麻烦的事,在初学阶段往往也忽视了这点。缺少空格的情况下可能会使阅读代码者混淆代码的含义,造成后续编写上的困难。一个产品被开发出来以后还需要进行维护与升级,而且开发一个产品往往不是只由一个人完成,所以有一个良好的编程习惯也是非常重要的。

0X03 程序的编译与运行(Linux为例)

在编写了程序后,就需要通过编译器对它进行编译,才能得到可执行文件。在IDE中往往只要点击编译运行按钮即可,所以在IDE中的过程便不再过多说明。在Linux中,编译C语言程序往往使用了gcc作为编译器,而且作为最常用的编译器之一,大多数的Linux发行版都直接带有gcc,不需要手动安装。以Hello World程序为例,将程序保存为hello.c后,可在shell中使用gcc进行编译,命令如下。

$ gcc hello.c -o hello

在通过编译后会得到一个名为hello的可执行文件,再使用./hello便可执行。从程序源码到可执行文件的过程其实相对复杂,而本文的主题为介绍C语言,所以不再过多解释说明。

0X04 Windows下编程

与Linux相同,Windows也同样可以使用C语言进行编程。如gcc有Windows实现版本mingw,安装后便可使用与上文相同的步骤进行编译与运行。但与Linux不同的一点是,Windows可执行文件通常以.exe作为后缀,可能需要使用./hello.exe进行执行。除去使用上述方法外,在Windows下进行C语言编程最常用的方法便是使用Visual Studio了。现在Visual Studio已经有免费的Community版,只需要进入VS官网下载安装即可。

0X04 结束语

在本篇中只是初步的介绍了C语言中最简单的一个程序,也是一个C语言程序大致的框架结构。在后续文章中,将会继续详细地介绍C语言。如有发现错误与不足之处欢迎留言或者发邮件与我联系。

0X05 参考资料

Brian W. Kernighan, Dennis M. Ritchie. The C Programming Language (2nd Edition).

文章首发自ghosind.com,转载请标明出处

C语言从零开始之Hello World相关推荐

  1. 使用Java语言从零开始创建区块链

    使用Java语言从零开始创建区块链 2018年04月01日 17:08:12 大侠区块链 阅读数:1312 标签: java区块链java区块链 更多 个人分类: 区块链 Java区块链开发与交流群: ...

  2. 使用Java语言从零开始创建区块连

    使用Java语言从零开始创建区块连: http://developer.51cto.com/art/201803/568032.htm

  3. C语言从零开始——学这一篇文章就够了

    这个假期重新回顾了之前这个<C语言从零开始>的系列.当时由于没有整体规划,想到哪儿写到哪儿,导致了里面的文章质量不够统一.于是,我又对里面的部分文章做了些调整,力求整体脉络更加连贯. 后面 ...

  4. r - 求平均成绩_R语言 从零开始的笔记(一)

    R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具. R语言于生物学分析中的应用越来越广泛,在其他领域的统计绘图应用 ...

  5. 自己写编译器词法分析c语言,从零开始写个编译器吧 - 开始写词法分析器(3)...

    上周周末旅游去了,就没更新了,虽然回到海拔0m的地区,不过目前似乎还在缺氧,所以本次就少更点吧. 这章将结束词法分析的部分. 在之前的章节(第7章从零开始写个编译器吧 - 开始写词法分析器(1))中我 ...

  6. 挖矿区块链_使用Java语言从零开始创建区块链

    目前网络上关于区块链入门.科普的文章不少,本文就不再赘述区块链的基本概念了,如果对区块链不是很了解的话,可以看一下我之前收集的一些入门学习资源:http://blog.51cto.com/zero01 ...

  7. 从零开始自学c语言,从零开始学习C语言

    了解指针变量,代码如下: int main() { int a = 10;//4个字节 int* p = &a;//取地址a printf("%p\n",p); //有一种 ...

  8. java开发区块链_使用Java语言从零开始创建区块链

    目前网络上关于区块链入门.科普的文章不少,本文就不再赘述区块链的基本概念了,如果对区块链不是很了解的话,可以看一下我之前收集的一些入门学习资源: 对区块链技术感到新奇的我们,都想知道区块链在代码上是怎 ...

  9. 5万字用纯C语言从零开始实现人脸检测

    文章目录 前言 一. BMP文件的处理 1.1 为什么选择BMP文件 1.2 BMP文件结构的介绍 1.3 BMP文件的读取和保存 二. 图片的形状变换 2.1 图像一维坐标与二维坐标的转换 2.2 ...

  10. 从零开始自学c语言,从零开始学C语言

    C语言介绍 C语言是一门广泛被应用于底层开发的计算机语言,它历史悠久,且功能强大,不需要任何运行环境的支持,几乎无所不能.世界上90%以上的互联网基础设施,都是用C语言编写完成的. 为什么学C语言 C ...

最新文章

  1. 记TX实习生笔试归来
  2. 读《我是一只IT小小鸟》笔记
  3. springboot日志写入mysql_44. Spring Boot日志记录SLF4J【从零开始学Spring Boot】
  4. Telegraf安装及使用
  5. 2019年JavaScript状态调查中的新增功能
  6. Windows漏洞:MS08-067远程代码执行漏洞复现及深度防御
  7. 形容时间过得快的句子,一些表示时间过得快的句子
  8. 使用Alcatraz来管理Xcode插件
  9. [C++面试题]之冒泡排序
  10. php100视频教程下载(全集),下载地址链接(整理后包涵解压密码)
  11. Node.js 实现远程桌面监控
  12. 解决kindle刷多看系统的问题
  13. goahead如何使用cgi服务_利用GoAhead构建嵌入式web应用
  14. 【端口被占用】查看占用程序,并结束占用程序、MySQL的Unable to connect to the database问题
  15. 区块链研究实验室-首次提出如何确保区块链分片技术的数据完整性
  16. 一道疯狂bypass的题目
  17. 工具---AI绘图:将文本文字描述转换成图片
  18. 关于数据,你的慌张,百度云ABC可能有办法!
  19. 如何防御DDoS等流量攻击?
  20. norflash/nandflash 启动分析 转

热门文章

  1. 管理之“其身正,不令则行;其身不正,虽令不从”
  2. Golang sync.Mutex源码分析
  3. 【Spring】BeanFactory
  4. ELK---搭建(LinuxWindows)
  5. 编写程序,完成找零钱任务
  6. 质谱及其数据分析处理(串联质谱及联用技术)
  7. Unity 项目优化细节
  8. 用于苹果开发者认证,邓白氏编码申请,再次申请
  9. 【docker login报错】x509: cannot validate certificate for IP地址 because it does not contain any IP SANs
  10. webpack实现ssr打包