从C到Cpp——一、输入和输出

一、头文件

C语言中的头文件以.h后缀结尾,如stdio.h和math.h,而Cpp中的头文件无后缀,如iostream,使用时#include即可。有些C头文件被转换为C++头文件,也按照C++的头文件风格命名,如cmath,使用时输入#include

当然,在C++中也是兼容.h结尾的C语言风格的头文件的,也可以#include,不过混搭不推荐。

二、名称空间以及其使用的辖域

1--

在C语言编程实践中,如果编码者A和B都设计了函数compare,两者功能不同且需要在同一个程序中使用,势必会发生冲突。名称空间的引入给予了编码者修改函数名以外的选择——名称空间能够让编码者所编写的函数封装在一个叫做名称空间的单元中,这样就可以使用名称空间的名称区分两个不同函数。

A编写函数的全称可以是Acode::compare();

B编写函数的全称可以是Bcode::compare();

2--

而类、函数和变量,比如常用的cout,也被封装在一个名称空间中。这个名称空间是std(仅当头文件没有拓展名.h时,情况才是如此,所以C语言和C++最好不要混搭

iostream中定义的用于输出的cout变量实际上时std::cout,endl实际上是std::endl。所以在编码时应该这样写

std::cout<<"Hello,world!";
std::cout<

当然,如果输出时都要写std::显得有点麻烦,可以在需要使用的地方提前输入这一行代码

using namespace std;

写完这一行代码后,就可以直接写cout而不用写std::cout。

cout<<"Hello,world!";

当然,你如果愿意再写一遍std::cout也是可以通过编译的

还要注意,要区分这一行代码的辖域(有点像discrete math中的量词辖域,很有趣!),写在程序不同地方的作用效果是不同的!如果想在整个程序中直接使用cout,可以在#include 的后面写上这么一句,如果想在某个函数中直接使用cout,则在这个函数开头写上这一句!

#include 
using namespace std;
void func(void);
int main (void)
{
	cout<<"Hello,world!";
	func();
}

void func(void)
{
	cout<

以上这一段,main和func中输出时都不用写std::,因为using namespace的辖域是整个程序。

#include 
void func(void);
int main (void)
{
	using namespace std;
	cout<<"Hello,world!";
	func();
}

void func(void)
{
	std::cout<

以上这一段,main中使用cout和endl不用写std::,而自定义函数func中需要写std::,因为using namesapce的辖域是从该段代码开始处到程序结束。

3--

using namespace std让std空间中的所有函数可用,也可以用如下方式让特定的名称可以直接使用。

using std::cout;
using std::endl;
using std::cin;

如此写完,只有cout、endl和cin可以直接使用,其他对象和符号还是要写std::的前缀

三、使用cout输出

1--

用C++程序输出一个字符串的方式是这样的:

#include 
using namespace std;
int main (void)
{
    cout<<"Hello,world!";
}

其中,cout是一个对象,<<是插入运算符,而"Hello,world!"是一个字符串,(实质上是一个字符串型指针)。直接理解对象比较困难,但我们可以用函数类比,"hello,world!"就像一个char*类型的参数,cout就像一个函数,负责把内容输出到输出流stdout中,也就是控制台上。

我们可以先这样用,到时候再理解其原理。

2--控制符endl

endl是一个c++的符号,表示重起一行,将光标位置移到下一行开头。使用方法如下:

cout<

当然,还可以如下使用,直接通过插入运算符号添加在cout的参数后面:

cout<<"Hello,world!"<

这也意味着,cout对象可以通过插入运算符<<被插入多个参数,如下编写代码也是可行的!

#include 
using namespace std;
int main (void)
{
	cout<<"hello,world!"<

3--cout对象的智能性

cout的智能性在于,它能识别通过插入运算符所传入的参数的类型,然后按照特定的方式打印这个参数。

#include 
using namespace std;
int main (void)
{
	int number=20;
	cout<

被插入的number是一个int型变量,就会以整数形式输出!

4--语句拼接

下面的一段代码打印了一行字符

cout<<"Now do the";
cout<<"flashbang dance";

它可以用如下形式代替

cout<<"Now do the "
    <<"flashbang dance";

这体现了C++语言还是具有一定灵活性的!

四、使用cin进行输入

1--

在C++中使用cin进行输入的方法如下:

int number;
cin>>number;

cin在iostream被定义为一个表示输入流stdin的对象,cin通过插入运算符>>将输出流中字符插入到右侧的变量之中。注意,cin非常智能,它能将输入的字符转化为右侧的变量能接受的形式!

2--小实验

为了了解cin的性质,我们尝试分别用不同的输入考验cin这个对象(古老的Devcpp5.11编译器),代码如下:

#include 
using namespace std;
int main (void)
{
	int num=1;
	cin>>num;
	cout<<"num:"<

a:输入10,输出10,常规功能,很好理解

b:输入[空格]10,输出10,说明cin会跳过空格(和scanf("%d",&num)一样)

c:输入10000000000000000,输出2147483647,说明cin很聪明,会有自动的上限检查,它可以检测到num是一个int型变量,就会把int的上限值赋给它

d:输入100a或100.0,输出100,说明cin读到第一个非阿拉伯数字字符就会停止读入(和scanf("%d",&num)一样)

e:输入a100或.100,输出0而不是1,说明cin读之前会清零,读不到什么就输出0

换一个程序我们再实验一下:

#include 
using namespace std;
int main (void)
{
	int num1=1;
	int num2=2;
	int num3=3;
	cin>>num1;
	cin>>num2;
	cin>>num3;
	cout<<"num1:"<

a:输入10[空格]10[空格]10,输出10 10 10,常规功能,注意,这是为可以跳过开头的[空格]所以才能达成

b:输入10[回车]10[回车]10,输出10 10 10,说明cin也会跳过'\n'这个字符

c:输入.100,输出0 2 3,说明第一个cin执行遇到错误后第二个和第三个cin就不被执行了,所以未被清零。

d:输入20.30,输出20 0 3,和我们通过c得到的结论一样说明cin执行遇到错误真的会通知剩下的cin让不要执行了,很团结!

再换一个程序我们试一下:

#include 
using namespace std;
int main (void)
{
	int num1=1;
	int num2=2;
	int num3=3;
	char word[10]={0};
	cin>>num1;
	cin>>num2;
	cin>>num3;
	cin>>word;
	cout<<"num1:"<

我们输入10.10,发现输出了10 0 3,没有再输出.10,说明cin遇到错误的“罢工”是不分类型的,直接遇到错误就一起“罢工”,太团结了!

我猜测,原理可能是给cin立了一个初始值为1的flag,每次用cin时都会进行检验,如果为flag为1才能继续运行,否则,就不运行cin了。而读入遇到错误,会让flag置0!(个人胡想罢了,哈哈哈,有兴趣的读者可以考证一下!)

总结一下,cin的智能性在于:

会跳过空格和换行符、会自动检查上限,会在遇到错误时暂停执行

你可能感兴趣的:(从C到Cpp,c语言,c++,开发语言,学习)