网站的推广方式有哪些,广西网站建设价格低,郑州同济医院曝光,黑龙江建设集团网站第2部分 与C第一次亲密接触
在浏览了C“三分天下”的世界版图之后#xff0c;便对C有了基本的了解#xff0c;算是一只脚跨入了C世界的大门。那么#xff0c;怎样将我们的另外一只脚也跨入C世界的大门呢#xff1f;是该即刻开始编写C程序#xff1f;还是……
正在我们犹…第2部分 与C第一次亲密接触
在浏览了C“三分天下”的世界版图之后便对C有了基本的了解算是一只脚跨入了C世界的大门。那么怎样将我们的另外一只脚也跨入C世界的大门呢是该即刻开始编写C程序还是……
正在我们犹豫的时候便看到前面有一个人被一群满头问号的C初学者围在当中。我们赶紧挤进去一看噢原来是一个C程序正做自我介绍呢。
2.1 一个C程序的自白
“大家好欢迎来到奇妙的C世界。我是C世界的迎宾——一个最简单最普通的C程序我的名字叫 “HelloWorld.exe”。我虽然简单而普通但却几乎是这个世界上最著名的C程序。每个来到C世界的初学者与C的第一次亲密接触都 是通过我来完成的。大家在听我介绍之前一定会觉得C程序非常神秘比如C程序是如何创建的一个完整的C程序由哪几部分构成传说中的源 文件到底是什么文件C程序是如何执行的其实我们C程序一点都不神秘跟大家一样我们有自己的老爸老妈有自己的五官四肢也有自己的生命 过程。什么大家觉得不可思议别着急下面且听我一一道来……”
2.1.1 用Visual Studio创建C程序
大家进入C世界最感兴趣的第一件事就是亲自动手创建一个C程序。大多数C程序都是通过一种叫做集成开发环境 Integrated Development EnvironmentIDE的软件创建的可以说它是创建C程序的工厂。虽然可以用于创建C程序的集成开发环境有很多但是我们首选的还 是由微软公司开发的Visual Studio。作为一款经过二十多年不断发展而来的集成开发环境Visual Studio拥有多种功能各异的版本有适用于大规模团队开发的旗舰版也有适用于个人开发的专业版还有免费的快速版。如果我们只是想利用Visual Studio进行C的学习我们可以使用其中的Visual C Express版本。它不仅功能齐备而且小巧。更重要的是它是免费的我们可以从微软的网站免费下载安装。Visual Studio是Windows平台上最常用的开发环境至于其它的开发工具以及Linux平台上的开发工具请大家参考后文的2.3小节。
现在请大家在我的引导下一步一步地使用Visual Studio创建我们的第一个C程序。第0步新建项目。从开始菜单找到已经安装好的Visual Studio并点击启动。当第一次启动Visual Studio时它会要求我们选择界面布局设置这里我们选择适用于Visual C的布局设置然后经过片刻的等待就可以看到Visual Studio华丽丽的起始页了。在Visual Studio中我们所有的开发工作都是在某个项目中进行的所以我们利用Visual Studio编写程序的第一步就是创建用于管理程序文件的项目单击起始页左侧的“新建项目”在弹出的“新建项目”对话框中选中左侧树状图中的 “Visual C”节点然后在右侧的项目类型列表中选中“空项目”这个项目模板接着在对话框下方输入项目名称“HelloWorld”并选择项目存放的位置最 后点击“确定”按钮就完成了新项目的创建。
图2-1 新建项目
第1步添加源文件。新项目的创建只是搭起了一个空的框架还等着我们向其中添加一些实质的内容。在左侧的“解决方案资源 管理器”中找到“HelloWorld”项目下的“源文件”分支然后右键单击“源文件”分支在弹出的菜单中依次选择“添加-新建项”就可 以得到“添加新项”对话框。在“添加新项”对话框中选中左侧树状图中的“Visual C”分支然后在右侧文件类型列表中选中“C文件”接着在对话框下方将文件名称修改为“HelloWorld.cpp”最后点击“确定”按 钮Visual Studio就会为我们新建一个HelloWorld.cpp源文件并添加到项目中。
图2-2 添加源文件
第2步编辑代码。有了空白的源文件就相当于画家支好了画板作家摆好了稿纸就等着我们开始编写代码了。在已经被打开的HelloWorld.cpp文件中我们编辑如下的代码这里值的特别提醒的是其中的标点都应该是英文的 #include iostreamusing namespace std;int main()
{// 在屏幕输出“Hello World!”字符串coutHello World!endl;return 0;
} 图2-3 编辑代码
第3步编译执行程序。代码编辑完成之后我们就可以编译并执行这个程序向C世界打个招呼了。这一步可以通过菜单命令 “调试-开始执行(不调试)”来完成但更多时候我们通过CtrlF5快捷键来完成。当我们按下快捷键之后Visual Studio会编译项目当中的源文件如果源文件中没有错误它就会生成相应的HelloWorld.exe可执行文件随后会启动执行这个程序从而在 DOS窗口打印出一个“Hello World”字符串向C世界打招呼。
图2-4 Hello World 最佳实践等一下,等一下,我还没看清输出结果呢 当我们在Visual Studio中执行某个程序时如果这个程序在执行过程中不需要与用户进行交互那么它执行时打开的DOS窗口会在其执行完毕后立即关闭。如果这个程序有 结果输出我们甚至来不及看清程序的输出结果。一个程序执行完了连输出结果都来不及看清这怎么行呢
为了解决这个问题我们可以在程序的主函数返回之前加上一条“system(pause);”语句。例如 int main()
{// …// 让程序在结束之前暂停system(pause);return 0;
} 加上这条语句后程序会在执行完毕之前暂停这样我们就有足够的时间看清程序的输出结果了。自然这条语句也还可以用在程序执行过程中那些需要暂停的地方以此来提高程序的可交互性。 另外一种查看程序输出结果的方法就是先启动DOS窗口然后DOS窗口中手动地执行我们的应用程序。在这种方式下DOS窗口并不会在程序执行完毕后关闭所以我们也有时间查看程序的输出结果。 经过这样四个简单的步骤我们就轻松编写了我们的第一个C程序完成了与C的第一次亲密接触。除了借助Visual Studio创建C程序之外我们甚至还可以采取纯粹手工的方式创建C程序。但无论何种方式它们的基本流程都是一样的。如果使用Visual Studio方式因为有开发工具的帮助上手容易开发效率也会比较高。而如果是使用手工方方式则可以对整个开发过程进行灵活定制从而满足我们一些个 性化的需求。对于初学者而言手工方式稍显复杂。最佳的学习路线应该是先以Visual Studio方式入门等到有了一定的基础需要对程序的编写过程有更精细控制的时候再改用手工方式。这样才不至于在入门阶段就被复杂的手工方式困住了 脚步而在进阶后又受到开发工具的限制。
2.1.2 C程序预编译指令程序代码注释
麻雀虽小五脏俱全。大家别看我个头小只有短短的几行代码实现的功能也很简单但是我同样拥有C程序的“五官和四 肢”预编译指令、程序代码和注释如图2-5所示。大多数情况下这三个基本组成部分都被放在一个扩展名为“cpp”的文本文件中这个文件被称为 C 源文件。源文件记录了我的“五官和四肢”规划了我的人生。源文件的编写者就是我的设计师了。通过修改源文件可以改变我的面貌、我的人生轨迹让我完成 各种任务实现各种功能。
图2-5 C程序预编译指令程序代码注释
下面大家一起来看看我的源文件从中认识我的“五官和四肢”。
1. 预编译指令
在源文件中以“#”开始的内容就是预编译指令。它的作用是告诉编译器让它在真正进行编译之前对源文件进行一些插入文件、替换字符串等预处理以得到最终参与编译的源文件。例如在我的源文件HelloWorld.cpp中第一行就是一个插入文件的预编译指令: #include iostream
其中“#include”指令用于将指定的文件插入该指令所在的位置作为整个源文件的一部分。因为这样的文件总是在一个源文件的头部被插入所 以我们通常将这样的文件称为头文件header file。在这里我们插入了“iostream”这个头文件这是因为我们在程序中需要用到其中定义的cout和endl来完成输出关于C的输 入输出可以参考后文2.2小节的介绍。需要注意的是“#include”指令后的文件名有两种表示方式如果使用双引号来包围一个文件名则预 处理器在处理这个指令的时候将首先在当前目录也就是这个源文件所在的目录下搜索这个文件如果不存在则继续在项目的包含目录包括项目的默认头文 件目录也就是Visual Studio安装目录下的“\VC\include”文件夹,以及在项目属性中设置的项目附加头文件目录下搜索这个文件而如果使用尖括 号来包围一个文件名预处理器则会直接在项目的包含目录下搜索这个文件。所以通常我们使用来插入当前项目目录下的头文件比如我们 自己创建的头文件而使用来插入各种项目包含目录下的库头文件比如这里的iostream。这里值得再次提醒的是代码中使用的所 有标点符号这里使用的尖括号也包括后面代码中用到的双引号、逗号、分号等必须是英文的。某些中英文符号非常相似很容易被初学者搞混淆而引起编译错 误这一点尤其值得初学者注意。
2. 程序代码
程序代码主体由若干C语句通常以分号结束的一行代码就是一条语句构成可以说语句是构成程序的基本单位。在我的源文件中第一条C语句是 using namespace std;
这条语句表示我所使用的名字空间是std。所谓名字空间就是程序中各种标识符比如这里的cout和endl我们通过这些符号来访问程序中的各 种元素实际上也可以说是这些元素的名字所以这些符号也被称为标识符所在的范围更具体的可以参考7.3.2小节关于名字空间的介绍。在C中任 何标识符都被定义在某个名字空间中而同一个标识符也可以在多个名字空间中同时定义。这就像张家村有一个人叫陈良乔而李家村也有一个人叫陈良乔一样大 家在称呼“陈良乔”这个人的时候为了表达清楚我们必须在名字前加上一个前缀称之为“张家村的陈良乔”或是“李家村的陈良乔”。C中的名字空间就 相当于这里的“张家村”、“李家村”。在这里我们在后面代码中使用的cout、endl都是来自std这个村的所以我们用这条语句告诉编译器如果遇 到没有加前缀的标识符比如这里的cout可以到std村去找找看如果能找到那就是它了结果在std村里找到了std::cout。 C的大多数内容都定义在std这个名字空间中所以很多时候我们都需要在代码中使用这条语句引入std名字空间。当然如果不使用这条语句我们也 可以在标识符的前面直接加上名字空间的前缀明确地表示这是来自于某个名字空间的标识符在代码中使用 std::cout代替 cout用std::endl代替endl。
接下来的一条语句是 int main()
这条语句连同它后面大括号内的内容共同构成了main()函数也称为主函数。所谓函数是C程序中最基本的一个组织单元它把若干条语句组 织到一起共同实现某个功能。如果说一条语句相当于人体的一个细胞的话那么函数就相当于由若干细胞构成的拥有一定功能的器官。而这里的主函数就是一个程序 中最重要的“器官”。一个C程序必须有一个主函数且只能有一个主函数。当C程序开始执行的时候将首先进入主函数然后逐条地执行其中的语句 直到其中的语句执行完毕退出主函数程序执行也就宣告结束。可以说主函数定义了一个C程序的一生。 知道更多为什么一个C程序必须有且只能有一个main函数 当我们双击执行程序后执行程序的进程会首先创建主线程主线程然后调用约定启动运行时库由启动运行时库调用约定好的main函数自此开始执行用户的代码。main函数是主线程的执行入口所以一个C程序必须有一个main函数。
同时一个线程不可能拥有多个执行入口。而且在C中全局符号(变量、函数) 只能有一个定义。main函数作为一个全局函数自然也就只能有一个。 接下来的就是主函数中的一条语句 coutHello World!endl;
cout是定义在头文件“iostream”中的一个输出流对象它是C标准库预定义的对象通常用于将文字或数字输出到屏幕。前面使用 “#include”预编译指令包含“iostream”头文件就是为了在代码中使用这个对象。关于输入/输出流会在以后的章节中做更详细的介绍这里 只要知道这条语句可以将“Hello World!”这串文字输出到屏幕上即可。值得再次提醒的是这里的双引号也必须是英文的。
我的最后一条语句是 return 0;
它表示程序成功执行完毕并返回return。通常我们返回一个0值表示程序成功执行如果在程序的执行过程中出现错误也可以返回表示错误信 息的其他数值。程序的执行者可以接受这个返回值以判断程序是否成功执行。到这里主函数中的语句执行完毕而我的一生也到此终结。
3. 注释
注释是源代码的编写者为了帮助代码的阅读者代码后期维护人员也包括编写者自己更好地理解代码而在代码中写下的关于某 一行或某一段代码的一些解释性文字。虽然源代码中的注释并不会参与最终的编译不会对程序的功能产生影响但它会提高代码的可读性为后期的维护带来极大 的便利。例如这里的 // 在屏幕输出“Hello World!”字符串
就是一条注释它解释了接下来的一条语句的作用从而可以让我们对代码有更好的理解。
在形式上C中的注释可以分为单行注释和块注释两种。“//”是单行注释符“//”之后直到换行的所有内容都属于注释。因为内容只有一行所以它常常用来对代码作简短的解释。例如上面的注释就是一个典型的单行注释。
C中的块注释我们用一对“/*”和“*/”表示凡是出现在这对符号之间的所有内容都属于注释。因为它可以包含多行内容当我们需要对代码做详细解释的时候可以使用块注释。例如 /*这是一段注释
*/
在功能上注释一般分为序言性注释和解释性注释。序言性注释多位于程序源文件的开始用来说明程序的文件名、用途、编写时间、维护历史等。在上面的例子中我们可以在源文件的第一行加上一个序言性注释来解释这个源文件的功能
// HelloWorld.cpp在屏幕输出“Hello World”字符串
序言性注释被广泛用于大型的项目中。通常每个项目都有自己定义的序言性注释格式用来向代码的阅读者说明一些必要的信息。 下面是从一个实际的项目中摘录的一段序言性注释它说明了源文件的名字、作用、文件的修改历史等信息帮助阅读者更好地理解代码。大家可以以此为模板编 写适合于自己的序言性注释。 ///
// AppDataView.cpp : implementation file
//
//CAppDataView
// This view is designed to display the App Data
//
// Version: 2.1
// Date: September 2001
// Author: Chen Liangqiao
// Email: chenlqlive.com
// Copyright (c) 2002. All Rights Reserved.
//
// History:
/*
27.09.2001 Chen Liangqiao Added OnCreate(), OnUpdate():Added usage of mesh tracer layersAdded bugfix for Graphics zoom error
30.10.2001 Chen Liangqiao Changed order of MPR View only in _TORCHTONAV
08.11.2001 Zeng Me Added EUpdateReason, used for UpdateAllView(),Added voxel trafoChanged the control panel due to new CTestCtrl
*//// 与序言性注释多位于源文件开始部分不同解释性注释多分散于源代码的各个部分用来向代码阅读者解释代码的含义说明一些必要的问题等。例如上面例子中的注释 //在屏幕上输出“Hello World”字符串
coutHello World!endl;
这句解释性注释就是用来向代码阅读者说明其下代码的功能是输出字符串“Hello World”。 最佳实践什么是好的注释 虽然程序的注释并不影响程序功能的实现编译器也不会去阅读我们的注释但是好的注释却可以增加程序代码的可读性使程序更易于维护。谁都不愿意维护一份没有注释的代码那无异于阅读天书。那么什么样的注释才算是好注释呢
首先该注释的地方一定要注释。
注释是对代码的“提示和说明”是为了帮助代码的阅读者更好地理解代码而存在的。当我们认为代码不能被“一眼看穿”而需要加以解释或者是代码需要特别说明的时候就应该添加注释加以额外的解释和说明帮助阅读者理解代码。例如 // 判断某个浮点数是否近似整数
bool is_int(double d)
{// 用浮点数d减去其整数部分(int)d获得其小数部分double s d - (int)d;// 判断小数部分是否在误差范围内if(s 0.000001)return false;elsereturn true;
} 这里的注释恰当地对比较难以理解的代码进行了解释如果没有注释很难一下子就理解“double s d - (int)d;”这行代码的含义到底是什么提高了代码的可读性。
其次不该注释的地方最好不要注释。
注释仅仅是对代码的“提示和说明”而已如果代码本身已经能够很好地做到“望文生义”也就没有必要“画蛇添足”地加以注 释了。另外需要注意的是注释只是简短的说明性文字不是详尽的文档。程序的注释不可喧宾夺主注释过多会让人眼花缭乱反而降低了代码的可读性。例如 下面代码中的注释就不太合适 // 判断某个浮点数是否近似整数// 其参数是表示输入的浮点数d// 其返回值是一个表示是否近似的bool值bool is_int(double d)
{// 用浮点数减去其整数部分获得其小数部分// 其中d表示浮点数(int)d表示浮点数的整数部分double s d - (int)d;// 判断小数部分是否在误差范围内if(s 0.000001)return false; // 小数部分大于误差范围则表示浮点数不近似整数返回falseelsereturn true; // 小数部分小于误差范围则表示浮点数近似整数返回true
} 这段代码中的注释对一些含义非常浅显易懂的代码也进行了详尽的解释注释的内容远超过了代码的内容这样不但没有增加代码的可读性反倒是让代码淹没在了复杂的注释中反而降低了代码的可读性。这样的注释实属“画蛇添足”多此一举。
另外应该养成良好的代码注释习惯。编写代码时添加必要的注释修改代码时修改相应的注释删除无用的注释保证注释与代码的一致性。
注释应当准确、易懂避免二义性。错误的注释不但无益反而有害。
注释的位置应与被描述的代码相邻可以放在代码的上方或右方不可放在下方。例如 // 在屏幕输出“Hello World!”字符串
// 对下方的代码进行注释
coutHello World!endl;int n 1024; // 循环次数对左侧代码进行注释
如果代码比较长特别是有多重嵌套时应当在某些段落的结束处加以注释以便于查看嵌套结构的起始和结束位置。例如一个多重循环的代码及其注释如下 for ( int i 0; i 100; i )
{for ( int j 0; j 100; j ){// 算法处理...} // j循环结束
} // i循环结束
程序代码不仅仅是写给编译器看的它更是写给程序员自己或者他人看的。对于编译器来说代码中有没有注释无所谓然而对于阅读代码的程序员来说合 适的注释可以很大程度上提高代码的可读性让代码更易于维护。因而注释是C程序代码中必不可少的一部分而程序代码中是否包含合适的注释也成为衡 量一个程序员是否优秀的标准。
预编译指令、程序代码与注释共同构成了我的“五官与四肢”但这时候我还只是一个后缀为cpp的文本文件而要得到最后的可执行的exe文件还得靠我的父亲母亲编译器和链接器。