C

C 知识量:16 - 74 - 317

2.1 简单的示例><

第一个示例- 2.1.1 -

通过一个简单的程序来初步了解一下C语言的语法。

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

以上是一个典型的“你好,世界!”程序,将打印“hello,world!”。下面分行解析一下:

  • #include <stdio.h>  表示包含标准输入/输出库的信息,这样就可以在程序中调用输入输出的库函数。

  • main(void)  表示名为main的函数,main函数是C语言的主函数,程序总是从main函数开始执行,括号内表示传递的参数,void表示这里不需要向其传递参数。

  • {   表示函数体以大括号{开始。

  • printf("hello,world!\n");  表示打印语句,语句以分号结束。printf()是标准输入/输出库的库函数,引号内的“hello,world!\n”称为字符串(或字符串常量),作为printf()函数的参数,其中\n表示换行。

  • }  表示函数体以大括号}结束。

更多的程序细节- 2.1.2 -

下面进一步解释一下第一个示例中的细节。

1、#include<stdio.h>

这条语句的作用是把stdio.h文件中的所有内容都添加到该行所在的位置,本质上就是对stdio.h文件的拷贝和粘贴。

#include代码是一条C预处理器指令,C编译器在编译前会对源代码做一些准备工作,即预处理。

所有的C编译器软件包都提供stdio.h文件,它包含了输入/输出函数(例如:printf()),因此,stdio.h被称为标准输入/输出文件。需要注意的是,并不是所有的程序都需要输入/输出函数,因此不是所有的程序都包含stdio.h文件。

通常情况下,在C程序顶部的信息集合被称为头文件,#include<stdio.h>就是头文件。

2、int main(void)

main()函数是一个非常特别的函数,C程序总是从main()函数开始执行。main()函数名称不可更改,且每一个完整的程序必须包含一个main()函数,main()函数又称为主函数。

int代表着main()函数的返回值类型,表示函数将返回给系统一个整数。

main后面的括号“()”表示它是一个函数,函数后面一定会有个一个括号。括号里面是要传递给该函数的参数,如果没有需要传递的参数,就设为void。以前的C版本可以空着什么也不写,最新的标准要求填入void,推荐按照最新的标准来写,这样在不同系统迁移时不会有意外发生。

3、花括号、函数体和块

花括号“{}”将程序代码包裹起来,表示其包裹的内容是函数main()的所属代码,被花括号包裹的部分称为函数体,用于实现函数的主要功能。

除了定义函数体外,花括号还可以将多条语句包裹起来,从何将这些语句合并为一个块(或称为单元)。

4、printf()函数

printf("hello,world!\n")表示打印“hello,world!”并打印一个回车。printf()函数是标准输入/输出库(stdio.h)中的函数,这里能够直接调用printf()函数,而不用先定义什么是printf(),正是因为前面已经包含了stdio.h,stdio.h已经对printf()函数进行了定义。

\n代表一个换行符,效果如同在键盘上按Enter键一样。换行符是一个转义序列,转义序列用于代表难以表示或无法输入的字符。除了\n以外,\t代表Tab键,\b代表Backspace键,除此之外,还有很多转义序列。

调试程序- 2.1.3 -

编写C程序时难免会犯错误,程序的错误通常叫做bug,找出并修正错误的过程叫做调试(debug)。程序的错误可以分为:语法错误和语义错误。

  • 语法错误 是指不遵循C语言的规则而犯的错误,例如语句结尾漏掉分号等等。排除语法错误的方法:一是在编译之前,浏览源代码,看是否有明显的语法错误。二是编译时,编译器会检查源代码,这也是编译器的工作之一,它会报告每处错误的性质和具体位置。

  • 语义错误 是指意思表示上的错误,即程序即使顺利运行,也没有按照自己的意图返回正确的结果。也就是说如果源代码遵循了C规则,没有语法错误,但是结果不正确,那就是犯了语义错误。对于排除语义错误,编译器是无能为力的,方法之一就是跟着程序的执行顺序,一步一步的分析程序状态。

程序状态是在程序的执行过程中,某给定点上所有变量值的集合。通过逐步跟踪程序的执行步骤,并记录每个变量,就可以监视程序的状态。分析程序状态是发现语义错误的基本手段。

调试程序的技巧总结:

  • 编译前检查一遍源代码,看是否有明显的语法错误。

  • 通过编译器的反馈,发现和修改语法错误。

  • 跟踪程序的执行顺序,一步一步分析程序状态,发现和修改语义错误。

  • 在程序的关键点临时插入输出代码(例如:printf()),把想要查看的变量作为参数传递给输出代码,监视变量值的情况是否符合预期。

  • 使用调试器检查更加复杂的程序。