C++学习(一)入门篇——进入C++
程序清单2.1 myfirst.cpp
//myfirst.cpp - - displays a message
#include <iostream> //预处理器编译指令#include int main() //函数头 { using namespace std; //编译指令 cout << "come up and C++ me sometime."; //{}中为函数体的内容 cout << endl; cout << "you won't regret it!" << endl; return 0;//cin.get(); }
这是一则显示消息的简单C++程序,我们通过程序来进行C++的学习
程序创建技巧
编程流程图
1.使用文本编辑器编写程序,所保存到的文件中就是程序的源代码。
2.用编译器将源代码翻译为主机使用的内部语言——机器语言,翻译后程序的文件就是目标代码。
3.将目标代码与其他代码连接起来。就是说将目标代码及将目标代码中使用的函数(比如执行屏幕显示和计算平方根任务)和一些标准的启动代码组合起来,生成程序的运行阶段版本。包含该最终产品的文件称为可执行代码。
给源文件命名时,必须使用正确的后缀,将文件标识为C++文件。它不仅表明了该文件是C++源代码。还将这种信息告知编译器,如UNIX编译器显示信息“bad magic number”,则表明后缀不正确。后缀由一个句点和一个或多个字符组成。也叫文件扩展名,文件扩展名cpp是一种表示C++程序的常用方法
下表列出了一些常用的文件扩展名
C++实现 | 源代码文件的扩展名 |
UNIX | C、cc、cxx、c |
GNU C++ | C、cc、cxx、cpp、c++ |
Digital Mars | cpp、cxx |
Borland C++ | cpp |
Watcom | cpp |
Microsoft Visual C++ | cpp、cxx、cc |
Freestyle Code Warrior | cp、cpp、cc、cxx、c++ |
接下来我们回归到程序的分析上来
注意:C++对大小写敏感(区分大写和小写字母),不然将会指出未知的标识符,程序无法通过编译。
程序调整
运行该程序,运行完毕后会自动关闭,可在return前添加cin.get();语句,可让窗口一直开着,直到按任意键。
运行正确的话,程序编译输出:
come up and C++ me sometime.
you won't regret it!
C语言输入和输出
C++中一般使用cout函数来进行输出
不过只要在C++中包含常规的C语言stdio.h文件,就能够使用printf()、scanf()和其它所有标准C输入与输出函数
1.函数头 int main()
函数头描述了函数与调用它的函数的接口
int表示函数返回类型,描述从函数返回给调用它的函数的信息
main()括号中部分叫做形参列表或参数列表,描述从调用函数传递给被调用函数的信息
通常,main()被启动代码调用,启动代码是由编译器添加到程序中的,是程序和操作系统中的桥梁
main函数中的空括号意味着它不接受任何信息或者任何参数。这个函数头表示可以给调用它的函数返回一个整数值,但不从调用它的函数那里获得任何信息
在C++中,int main(void)和int main()等效
或者说void main()这在逻辑上与上面一致,函数不返回任何值。但这不是当前标准强制的选项,在有些系统中不能工作,应避免使用这种形式。
如果编译器到达main()函数末尾没有遇到返回语句,则默认为以return 0结尾,只适用于main()函数,而不是用于其他函数。
2.为什么main()不能使用其他名称
之所以将C++程序中函数命名为main(),因为程序中必须包含一个名为main()的函数,因为myfirst.cpp程序只有一个函数,那么该函数必须承担起main()的责任,不然程序将不完整,编译器将指出未定义main()函数。
3.注释
C++用//来注释,编译器会忽略注释。
注释不仅有利于他人理解这些代码,特别对一段时间没有接触程序的程序员来说也很有帮助。
但C++也可以使用C语言的注释/* */可以跨越多行,但尽量使用C++的注释风格,使产生问题可能性最小。
4.C++预处理器和iostream文件
预处理编译指令#include将iostream文件的内容添加到程序中(典型的预处理器操作:在源代码被编译之前,替换或添加文本)
为什么要将iostream文件的内容添加到程序中?
io指的是输入和输出,C++中输入和输出方案涉及iostream文件中多个定义,为了用cout显示消息,myfirst.cpp需要这些定义。
#include编译指令让iostream文件的内容随源代码的内容一起发送给编译器,iostream文件内容将取代代码行#include<iostream>,原始文件没被修改,而是将源代码文件和iostream组合成复合文件,进行编译使用。
注意:cin输入和cout输出程序必须包含文件iostream
5.头文件名
C++编译器包含了很多头文件,每个头文件都支持一组特定的工具
头文件类型 | 约定 | 示例 | 说明 |
C++旧式风格 | 以.h结尾 | iostream.h | C++程序可以使用 |
C旧式风格 | 以.h结尾 | math.h |
C、C++程序可以使用 |
C++新式风格 | 没有扩展名 | iostream | C++程序可以使用,使用namespace std |
转换后的C | 加上前缀c,没有扩展名 | cmath | C++程序可以使用,可以使用不是C的特性,如namespace std |
6.名称空间
using namespace std;
通过这个指令使iostream中的定义对程序可用。
using为编译指令,名称空间是一项C++特性,使在编写大型程序和多个厂商现有代码组合起来程序更容易。
比如:
两个已经封装好的产品,它们都包含一个名为wanda()的函数,那么使用这个函数时,编译器不知道使用哪个版本,名称空间可以让厂商将产品封装在它的单元里,如
Microflop公司的版本为:Microflop::wanda(“go dancing?”);
Piscine公司版本为:Piscine::wanda(“a fish named Desire”);
按照这种情况,类、函数和变量便是C++编译器的标准组件,它们现在都被放置在名称空间std中,仅当头文件没有扩展名h时,才如此。
则意味着iostream中定义的cout和endl等实际上为std::cout和std::endl。可省略using。
但using编译指令使得std名称空间中所有名称都可用。
7.使用cout进行C++输出
cout<<"come up and C++ me some time.";
双括号括起的部分是要打印的消息,双引号括起的一系列字符叫做字符串,因为它是由若干字符组合而成的。<<表示该语句把这个字符发送给了cout,指出了信息流动的途径。
把右侧的信息插入到出输出流中,cout对象表示这种流。
8.控制符endl和换行符
打印字符串时,cout不会重起一行,靠endl来实现。
如果要在两个字符串之间留一个空格,必须将空格包含在字符串中。
\n视为换行符,在字符串中输入换行符,即可换行。
如:cout<<"What's next?\n";
显示用括号引起的字符串时,通常使用换行符\n,其他情况下使用endl。
一个差别是,endl确保程序继续运行前刷新输出(将其立即显示在屏幕上);而用“/n”不能提供这样的保证,有时可能输入信息后才会提示。
9.C++源代码的格式化
在有些语言中,回车的作用是将语句分开,而在C++中,分号标示了语句的结尾,回车的作用就和空格或制表符相同。
但不能把空格放在元素或字符串中间,如:
int ma in()
cout<<"Behold the Beans
of Beauty!";
一行代码中不可分割的元素叫做标记,如int和main()
10.C++源代码风格
遵循合理的风格,程序将更便于阅读
(1)每条语句占一行
(2)每个函数都有一个开始花括号和一个结束花括号,这两个花括号各占一行
(3)函数中的语句都相对于花括号进行缩进
(4)与函数名称相关的圆括号周围没有空白
前三条规则旨在确保代码清晰可读,第四条帮助区分函数和一些也使用圆括号的C++内置结构(如循环)