目录
【该文章将收录在C++讲解的专栏里面,感兴趣的读者可以收藏学习,专栏也会定期更新,我们一起学习加油!】
PS:有兴趣的读者可以去看看《C++ Primer Plus》这本书,里面对C++的讲解非常详细,本文章也是从这本书中进行的学习和理解。
1.1 进入 C++
跟进入程序第一天一样,我们先来输出一个 “ Hello world! ”以此来开始正式的 C++ 学习。
//程序清单 1.1 #include<iostream> int main() { using namespace std; cout << "Hello world!"; cout << endl; cout << "Welcome." << endl; return 0; }
显示结果:
Hello world!
Welcome.
--------------------------------
对于之前接触过其他语言的读者来说,这一部分可能很好理解。但是没有接触过任何语言的读者也不用担心,所有的问题都会在以后慢慢进行讲解。
上述示例包含以下元素:
1. 注释,由前缀 // 标识。
2. 预处理器编译指令 #include。
3. 函数头: int mian()。
4. 编译指令 using namespace。
5. 函数体,用 { 和 } 括起。
6. 使用 C++ 的 cout 工具显示消息的语句。
7. 结束 mian() 函数的 return 语句。
下面详细介绍这些元素。首先先来介绍一下 mian() 函数。
1.1.1 main() 函数
程序清单 1.1 的基本框架
#include<iostream>
int main()
{
.....
...
..
return 0;
}
这几行表明有一个名为 main() 的函数,并表述了该函数的行为。其中 int main() 是函数头,其后面的 { 和 } 中的部分叫做 int mian() 函数的函数体。函数头对函数与程序其他部分之间的接口进行了总结;函数体是指出函数应做什么的计算机指令。在 C++ 中,每条完整的指令都称为语句。记住在C/C++中都是以分号结束(这一点,从python语言过来的读者可能会不太习惯)。
mian() 中最后的 return (返回语句),是用来结束该函数的。
1.1.2 C++注释
C/C++的注释都是以 // 打头,到尾行结束。注释可以位于单独的一行上,也可以和代码部分同行。很多人在写代码的时候不喜欢注释,认为太浪费时间太麻烦了。其实有经常注释的习惯是非常好的,不仅可以让别人更好的理解自己的代码内容,也可以为自己将来重新回顾代码的时候更加的方便,在一些大型的项目中就显得尤为重要。
为便于理解,这里给出两个示例:
//可以独占一行来进行注释
int main() //也可以与代码同行
{
.....
...
}
/*
C++ 里也可以使用 C 中的这个注释符号
它的好处是可以用于成段的注释
这样就显得很方便
*/
1.1.3 C++预处理器和 iostream 文件
如果熟悉 C 的读者都明白在编写一段程序前需要写一个预处理文件
#include<stdio.h>
但是在 C++ 中有所不同,如果程序需要使用 C++ 中的输入或者输出工具时,需要使用下述两行代码
#include<iostream>
using namespace std;
#include<iostream> 该编译指令导致预处理器将 iostream 文件的内容添入到程序中。这是一种典型的预处理器操作:在源代码被编译之前,替换或者添加文本。
那么为什么要添加 iostream 文件呢?因为要涉及程序与外部世界的间的通信。其中最典型的便是:从键盘中获取数据(cin);向外输出数据显示(cout)。这里我们就不过多的讲解了。
注意:使用 cin 和 cout 进行输入和输出的程序必须包含文件 iostream。
1.1.4 头文件名
学过其他语言的读者应该不陌生。像 iostream 这样的文件叫做包含文件(include file)——由于它们被包含在其他文件中;也叫头文件(header file)——由于它们被包含在文件的起始处。C++ 编译器自带了很多头文件,每个头文件都支持一组特定的工具。熟悉 C语言 的读者都明白,C 的传统是,头文件使用扩展名 h,将其作为一种通过名称标识文件类型的简单方式。
举个例子:
#include<stdio.h>
#include<math.h> //支持各种C语言数学函数的头文件
但是在C++的用法变了。现在对老式 C 的头文件保留了扩展名 h (C++ 程序仍然可以使用这种文件),而 C++ 的头文件没有扩展名,在原有的基础上去掉扩展名 h 使之成为 C++ 风格的名称。
同样举个例子:
#include<iostream>
#include<cmath> //支持各种C语言数学函数的头文件
可以看出 C/C++ 二者的区别。下 表1.1 对头文件得到命名约定进行了总结。
头文件命名约定
头文件类型 | 约定 | 示例 | 说明 |
C++旧式风格 | 以 .h 结尾 | iostream.h | C++程序可用 |
C 旧式风格 | 以 .h 结尾 | math.h | C/C++程序可用 |
C++新风格 | 没有扩展名 | iostream | C++程序可用,需使用 namespace std |
转换后的 C | 加上前缀 c,没有扩展名 | cmath | C++程序可用,可用不是 C 的特性,如 namespace std |
表 1.1(来源:《C++ Primer Plus》)
1.1.5 名称空间
如果使用 iostream ,而不是 iostream.h ,则应使用下面的名称空间编译指令来使 iostream 中的定义对程序可用:
using namespace std;
这个叫做 using 编译指令。这里不需要过多的了解,但是我们需要知道一些情况:
//程序清单 1.2
//如果不使用 using namespace std;
#include<iostream>
int main()
{
std::cout << "Hello world!";
std::cout << std::endl;
std::cout << "Welcome." << std::endl;
return 0;
}
显示结果:
Hello world!
Welcome.
--------------------------------
结果和 程序清单1.1 没有区别,但是中间的却有所不同—— 程序清单1.2 种使用的是 std::cout 和 std::endl 这两种,原因就是因为没有使用 using 编译指令。所以这些区别请大家要注意一下。
1.1.6 使用 cout 进行 C++ 输出
这里我们简单介绍一下它的用法,对于其内部的过程就不过多的赘述了:
如何在 C++ 种显示一条消息?
熟悉 C 的读者应该知道在 C 中的输出是 printf()函数,接受数据的是 scanf();但是在 C++ 中却不是这样。在 C++ 中我们使用 cout << 的方式来进行:
cout << "Hello world!";
这样就在界面上显示了 “ Hello world! ” 的消息,其实通过 << 的方向也可以明白,其数据的传输方向是传输给 cout 的,这个就仅仅解释到这里即可。
1.endl 控制符
现在来看看另一段代码:
cout << endl;
这一段代码显示出来其实就是换行的作用,说的官方一点就是:重起一行。诸如 endl 等对于 cout 来说特殊含义的特殊符号被称为控制符(manioulator)。和 cout 一样,endl 也是在头文件 iostream 中定义的,且位于名称空间 std 中。
通过这些我们会发现一个有趣的地方:在打印字符串时,cout 不会自动移到下一行,因此如果我们按以下方式去写代码:
cout << "The Good, the";
cout << "Bad, ";
cout << "and the Ukulele";
cout << endl;
那么其输出结果为:
The Good, theBad, and the Ukulele
这时为了保证代码的可观赏性 cout << endl; 就显得尤为重要了。
2.换行符
C++ 中还提供了另一种在输出中指示换行的旧式方法:C 语言符号 \n:
cout << "Hello world!\n";
这个对于熟悉 C语言 的读者来说可以跳过。其实效果跟上述的一样,可以减少输入量。
另一方面,如果要生成一个空行,大多数人选择输入 endl (本人也是,可能是习惯导致):
cout << "\n"; //生成空行
cout << endl; //生成空行
换行符是一种被称为 “ 转义序列 ” 按键组合。
1.1.7 C++格式
一个好的程序不仅仅是它可以正常运行,还要有一定的规范化以及可观赏性,所以我们在以后编写程序时可以遵循下面的规范:
1. 每条语句占一行。
2. 每个函数都有一个开始花括号和一个结束花括号,这两个花括号各占一行。
3. 函数中的语句都相对于花括号进行缩进。
4. 与函数名称相关的圆括号周围没有空白。
前三条规则旨在确保代码清晰易读;第四条规则帮助区分函数和一些也是用圆括号的C++内置结构(如循环)。
后续
学习的过程不能一蹴而就,因此长篇大论未必是有效的学习,故本篇的讲解到此先告一段落,希望大家可以认真看完并且理解。
下一篇将讲解——C++ 语句(函数的调用等等)。