1.简单的C语言程序结构

要建造房屋,首先需要打地基、搬砖搭建框架(这大概就是为什么叫搬砖的原因)。学习计算机语言的时候也一样,应该从基本的结构开始学起。下面,我们看一段简单的源代码,这段代码希望大家动手对着敲一遍,自己动手完完全全敲一次。我想对于刚学编程的人,即使对着敲,也是极其容易出现错误的。当看到编译器很多的错误时候,也别慌。其中最大的两个原因,一个是使用了中文字符,比如中文的分号以及括号,二是拼写单词错误。我们在编程的时候,需要全部使用英文符号。比如,程序中的分号以及括号。

//myfirst.c   -- 显示消息
#include <stdio.h> int main()
{
    printf("Hello\n");
    printf("程序员基础知识!");     return 0;
}

运行编译程序(快捷键“ctrl+F5”)后得到的输出:
Hello
程序员基础知识!

下面我们将这段代码分析一下,可以从以下几个部分来看:

  • 1)注释,代码的注释,是对代码的说明。编译器会忽略注释,毕竟机器也不想看你的注释QAQ。

  • 2)预处理器编译指令#include,以及包含的头文件。

  • 3)函数头:int main()。C语言程序由函数构成,一个程序可以有多个函数,但是有且只有一个主函数,也就是main()函数。

  • 4)函数体,花括号“{}”括起来的部分,包括各种指令组成的语句在内。

  • 5)结束main()函数的return语句。

2.注释

C语言有两种注释方式:

  • 1)“//”
    这个其实是C++风格注释,通常用于注释单行文本或代码,它们放在一起组成多行注释。
    以 // 开始,到行尾结束。单行注释,这种注释可以单独占一行,也可以和代码位于同一行。

  • 2)“/* */”
    这个是C风格注释,通常用于注释大块文本或小片代码,也能用它们注释单行。  
    以 /* 开始,到 */ 结束。因此可以跨越多行。

C 风格注释可出现在 C++ 风格注释内:

//  printf("Hello World!");   /* 输出Hello World! */

C++ 风格注释可出现在 C 风格注释内:

/*
    printf("Hello\n");    //输出Hello,并且换行
    printf("程序员基础知识!");    //输出程序员基础知识!
*/

两者可以同时存在,并不冲突:

printf("Hello World!");
/* 与 C 风格注释不冲突 */
// 与 C++ 风格注释不冲突

注释主要是为了更好的读懂代码,使人能明确的看出代码的功能。写注释是一个编程的好习惯,而且在以后的团队开发或者代码维护有相当重要的作用。看别人没用注释甚至不规范的代码,肯定让你头疼。在实际工作中经常遇到自己代码写完,过一段时间测试出了bug或者改了需求之类,你还要再看自己代码,有注释就不会忘记了。

3.预处理器和头文件

  • 1)预处理器
    预处理器在程序编译之前对源文件进行处理,采用以“#”为行首作为指示,include是预处理指令的一种。
    预处理指令包括:include
    、define 、undef 、if 、 ifdef 、 ifndef 、 else 、 elif 、 endif 、 line 、
    error 、 pragma等。我们现在先了解#include,又叫文件包含预处理指令,每个指令占据一行。

  • 2)头文件
    头文件,包含在文件最开始的地方。头文件使用.h为扩展名,头文件提供通用文件操作支持以及提供输入/输出的函数。在这段代码中,主要是提供printf()函数。如果没有这个头文件,我们使用printf()函数将会报错。

4.main()函数

通常,C语言程序中必须包含一个名为main()的函数。main()函数由系统调用执行,main()函数是程序执行的入口函数。运行C语言代码时,从main()函数开始。main()函数由两部分组成,函数头int
main()部分和函数体用花括号“{}”括起来的部分。main()函数的定义以函数头int
main()开始,函数体的作用是指出计算机做什么指令操作。每条完整的指令称为语句,语句以分号“;”结束,所以在C语言程序中不能省略分号。main()中的最后是返回语句return
0,用来结束该函数,0代表程序正常退出。

int

main()的其它写法,可以省略int就写成main()。这是因为在C语言中,省略返回类型则默认为int(C++中逐步淘汰了这种用法)。所以我们就别偷懒了,还是别用这种写法了。还有写成int
main(void)和void main()的,我都不推荐,大家还是用int
main()最好了。下面是我手画(字丑请自行忽略)的main()结构图:

5.printf()函数输出字符串

printf()函数的作用是格式化输出。我们来看这段代码:printf("Hello\n");

双引号括起来的部分是要打印的消息。里面的一系列字符(Hello)叫做字符串。“\n”是指示换行的,被看成一个字符,所以叫做换行符,作用是取新的一行开始。下面的printf("程序员基础知识!");
语句,就会另取一行打印输出了。

6.空白

空格、制表符、回车都可以称为空白。空白可以分隔语句的各个部分,让编译器能识别语句中的某些元素在哪里开始和结束。比如语句:int main(),如果你将其写成intmain(),那么程序将报错。有些字符之间不需要用空白分开,比如括号和逗号。

只包含空格的行,编译器会忽略它。为了增强代码可读性,可以根据需要适当增加一些空格。

7.总结

总结一下,本节内容主要介绍了C语言程序的一般格式,具体包括注释、预处理器和头文件、main()函数、printf()函数输出字符串。

8.练习

2-1 假设main()函数包含代码:printf("程序员基础知识!"); 编译器报错“printf”: 找不到标识符,是什么原因?
2-2 return 0;表示成功结束,那么return -1;表示什么?
2-3 编写一个C语言程序,第一行显示“hero:盖伦”,第二行显示“attack:300”,并对代码做一些简单的注释,比如在旁边注释,英雄:盖伦。

可以在评论中,写下你们的练习答案。

之后的文章会给大家带来更精彩的内容
欢迎关注我的知乎专栏:程序员基础知识

获取练习答案以及更多实战项目
欢迎关注我的公众号:程序员基础知识
交(gao)流(ji)群:493584686

C语言入门教程-(2)基本程序结构的更多相关文章

  1. 【C语言入门教程】7.3 结构体指针的定义和引用

    C 语言中指针的操作非常灵活,它也能指向结构体变量对结构体变量进行操作.在学习结构指针之前,需要再次加深对指针的认识.声明指针变量时所使用的数据类型修饰符实际上的作用是定义指针访问内存的范围,如果指针 ...

  2. 【C语言入门教程】7.1 结构体类型变量的定义和引用

    前面学习了变量和数组这些简单的数据结构,它们的特点是必须使用规定的数据类型.例如数组被定义为整型后,它的所有存储单元都是由整型构成.现实生活中某一类事物的共同属性可能是由不同的数据类型组成的集合,或者 ...

  3. 【C语言入门教程】7.2 结构体数组的定义和引用

    7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...

  4. 《JavaScript语言入门教程》记录整理:入门和数据类型

    目录 入门篇 js介绍 历史 基本语法 数据类型 概述 null 和 undefined 数值 字符串 对象 函数 数组 本系列基于阮一峰老师的<JavaScrip语言入门教程>或< ...

  5. 《JavaScript语言入门教程》记录整理:运算符、语法和标准库

    目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...

  6. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

  7. C语言入门教程-(5)格式化输入输出

    1.输入和输出 在程序的使用中,我们经常可以看的这么一个场景:用户需要输入数据,经过程序运算,得到结果后输出.在C语言中,输入数据和输出数据都是由库函数完成的,通过语句来输入/输出. 2.格式化输出— ...

  8. Go语言入门教程(十)之函数

    Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...

  9. c语言该怎么入门?C语言入门教程(非常详细)

    C语言是一门面向过程的编译型语言,它的运行速度极快,仅次于汇编语言.C语言是计算机产业的核心语言,操作系统.硬件驱动.关键组件.数据库等都离不开C语言:不学习C语言,就不能了解计算机底层. 这套「C语 ...

随机推荐

  1. 前端切图相关ps技术

    标签(空格分隔): 前端切图 复制图层到一个新的ps文件 对于单个图层 1.选中图层 2.CTRL+A全选 3.CTRL+C 4.CTRL+N新建文件,文件大小默认就可以(背景透明也在这个面板设置), ...

  2. js+Canvas 利用js 实现浏览器保存图片到本地

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. Java中的多线程科普

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  4. testdisk修复文件系统

    故障修复步骤: 1. 检查磁盘分区级文件系统确实不在: 2. 云主机内部下载testdisk工具修复 yum install testdisk -y 3. 执行命令testdisk /dev/vdc进 ...

  5. spring的jar包以及相关的API文档的下载方式

    转自:http://blog.csdn.net/yuexianchang/article/details/53583327 侵删 感谢原创 首先是进入官网:https://spring.io/ 如图所 ...

  6. 每日一问(如何在List中加入、设置、获取和删除其中的元素?)

    作为集合接口的一部分,对List接口所做的操作,最常见的就是增删查改了.这里总结下JAVA 中List接口及实现该接口的类实现这些操作的方法. 一.增加新的元素的方法 在Collection接口中定义 ...

  7. BZOJ3277 串(后缀数组+二分答案+主席树)

    因为不会SAM,考虑SA.将所有串连起来并加分隔符,每次考虑计算以某个位置开始的子串有多少个合法. 对此首先二分答案,找到名次数组上的一个区间,那么只需要统计有多少个所给串在该区间内出现就可以了.这是 ...

  8. 手写简单的promise

    function Promise(fn) { var that = this; this.status = "pedding"; this.value = undefined; / ...

  9. P3835 【模板】可持久化平衡树

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的 ...

  10. 整理:python的二维数组操作

    Python中初始化一个5 x 3每项为0的数组,最好方法是: multilist = [[0 for col in range(5)] for row in range(3)] 如果初始化一个二维数 ...