C语言开发基础教程(Dev-C++)(第2版)
上QQ阅读APP看书,第一时间看更新

1.5 编写Hello World

本节我们将以一个简单程序为例,帮助读者快速熟悉Dev-C++的使用方法,了解C语言程序的编写流程。

1.5.1 编写第一个程序Hello World

Dev-C++开发工具可以很好地支持中文,而且编译器界面友好,具备提示功能。本节我们将通过一个向控制台输出“Hello,world!”的程序,为读者演示如何使用Dev-C++工具开发一个C语言应用程序。具体实现步骤如下。

1. 新建文件

打开Dev-C++后,在菜单栏依次单击【文件】→【新建】→【源代码】,如图1-14所示。

图1-14 新建文件

2. 编写程序代码

在代码编辑区写入代码,如图1-15所示。

图1-15 编写程序代码

图1-15中的代码如下:

 1   #include <stdio.h>  
 2   int main()    
 3   { 
 4      //使用系统提供的标准输出,在控制台显示信息 
 5      printf("Hello, world!\n");  
 6      return 0;     
 7   } 

3. 保存文件

编写完成之后单击菜单中【文件】→【保存】选项,将会弹出路径选择窗口,在该窗口可为文件选择保存路径,并设置文件名与文件类型,如图1-16所示。

图1-16 保存文件

此处将文件保存在Demo目录下,设置文件名为HelloWorld,文件类型为C source files(*.c)。设置完成后单击【保存】按钮,保存文件。

4. 编译运行程序

在菜单栏选择【运行】→【编译运行】来运行程序,或按快捷键【F11】运行程序。编译运行结果如图1-17所示。

图1-17 编译结果

编译完成后,会弹出打印有程序运行结果的命令行窗口,如图1-18所示。

图1-18 运行结果

图1-18所示界面中成功打印出“Hello,world!”,说明程序运行成功。

5. 代码分析

HelloWorld程序共包含7行代码,各行代码的功能与含义分别介绍如下。

• 第1行代码的作用是进行相关的预处理操作。其中,字符“#”是预处理标志,include后面跟着一对尖括号,表示头文件在尖括号内读入。stdio.h就是标准输入/输出头文件,因为第5行用到了printf()输出函数,所以文件需要包含此头文件。

• 第2行代码声明了一个main()函数,该函数是程序的入口,程序运行从main()函数开始执行。main()函数前面的int表示该函数的返回值类型是整型。代码第3~7行“{}”中的内容是函数体,程序的相关操作都要写在函数体中。

• 第4行是程序代码单行注释部分,使用“//”来表明,从“//”开始到该行结束部分属于注释部分,不参与程序编译过程。

• 第5行代码调用了格式化输出函数printf(),该函数用于输出一行信息,可以简单理解为向控制台输出文字或符号等。printf()括号中的内容称为函数的参数,括号内可以看到输出的字符串“Hello,world!\n”,其中“\n”表示换行操作。

• 第6行代码中return语句的作用是将函数的执行结果返回,后面紧跟着函数的返回值,在该程序的返回值中,0表示正常退出。

在C语言程序中,以英文分号“;”为结束标记的代码都可称为语句,如HelloWorld程序中的第5行、第6行代码都是语句,被“{}”括起来的语句被称为语句块。

多学一招:多行注释

1.5.1小节所示案例中的注释方式称为单行注释,单行注释只能注释单行,若程序中有多条连续语句需要注释,可使用多行注释。多行注释的格式如下:

/*   
…… 
  */

具体示例如下:

/*  printf("Hello, world\n");   
return 0;  */ 

注释可嵌套使用,但只能由多行注释嵌套单行注释,具体示例如下:

/*  printf("Hello, world\n");    //输出Hello,world 
     return 0; */ 

需要注意的是,多行注释不能嵌套多行注释,错误示例如下:

/* 
     /* printf("Hello, world\n"); 
         return 0;  */ 
*/ 

以上示例无法通过编译,因为外层注释的“/*”会和内层注释的“*/”进行配对,如此内层注释的“/*”及外层注释的“*/”都无法正确匹配,进而导致程序错误。

1.5.2 C程序编译运行原理

C语言作为高级语言,无法被计算机直接识别。那么计算机是如何理解C语言代码,进而执行程序,给出运行结果的呢?事实上,在开发工具中直接运行代码后,代码并不会直接被执行,而是在经过预处理、编译、汇编和链接这4步之后,才生成可执行代码,其过程如图1-19所示。

图1-19 编译原理

下面我们分别对图1-19所示的4个步骤进行说明。

(1)预处理

预处理主要处理代码中以“#”开头的预处理语句(预处理语句将在第9章讲解),预处理完成后,会生成*.i文件。预处理操作具体包括以下几项:

• 展开所有宏定义(#define),进行字符替换。

• 处理所有条件编译指令(#ifdef、#ifndef、#endif等)。

• 处理文件包含语句(#include),将包含的文件直接插入到语句所在处。

需要注意的是,代码中的编译器指令(#pragma)会被保留。除此之外,预处理还会进行以下操作:

• 删除所有注释。

• 添加行号和文件标识,以便在调试和编译出错时快速定位到错误所在行。

(2)编译

编译操作对预处理文件*.i进行词法分析、语法分析、语义分析后生成汇编文件*.s。

(3)汇编

汇编操作指将生成的汇编文件*.s翻译成计算机能够识别的二进制文件。在Linux系统中的二进制文件是“*.o”文件,Windows系统中是“*.obj”文件。

(4)链接

生成二进制文件后,文件尚不能运行,若想运行文件,需要将二进制文件与代码中用到的库文件进行绑定,这个过程称为链接。链接操作完成后将生成可执行文件。