通过c语言与c++代码对比初步认识c++《1》

一.对一个整型数组求和
定义一个存储着n个元素的数组

1.C语言

#include<stdio.h>
//int addArray(int array[], int n)
int addArray(int *array, int n);
int main()
{
	int data[] = { 0,1,2,3,4,5,6,7,8,9 };
	int size = sizeof(data) / sizeof(data[0]);
	printf("data%d\n", sizeof(data));

	printf("结果是:%d\n", addArray(data, size));

	return 0;
}
//int addArray(int array[], int n)
int addArray(int *array, int n)
{
	int sum = 0;
	int i = 0;
	printf("array%d\n", sizeof(array));
	for (i = 0;i < n;i++)
	{
		sum += array[i];
	}
	return sum;
}

2.C++

#include<iostream>

using namespace std;

int addArray(int* array, int n);
int main()
{
	int data[] = { 0,1,2,3,4,5,6,7,8,9 };
	int size = sizeof(data) / sizeof(data[0]);
	cout << "结果是:" << addArray(data, size) << endl;
	return 0;
}
int addArray(int* array, int n)
{
	int sum = 0;
	int i = 0;
	for (i = 0;i < n;i++)
	{
		sum += array[i];
	}
	return sum;
}

仔细观察两者有很大一部分相同,但还是有不一样的地方,我们接下来就对不一样的地方进行一些探讨

第一,using namespace std  C++里面出现了这一段代码,而在C语言里是没有的,我们称它为名字空间命名空间,通过查询我了解到命名空间的作用。在C语言里只有一个全局作用域,标识符之间是有可能发生冲突的。而在C++里面,我们通过命名空间将全局作用域分成不同的部分,不同命名空间里的标识符是可以相同的。

第二,cout << "结果是:" << addArray(data, size) << endl这句代码,

与C语言里printf("结果是:%d\n", addArray(data, size))类似

<1>首先我们看cout,cout是一个输出流对象 ,是“console out(控制台输出)”的缩写。  是属于basic_ostream类的对象。而ostream类在iostream头文件中定义,所以我们这段代码,引用了头文件#include<iostream>。这里又是一个不同,C++里面的头文件并没有.h。

<2>接下来是<<,我们学习C语言的时候学到过<<和>>是左移操作符和右移操作符,在C++里他们也是,只不过他们发生了重载

体现C++一个很大的特性:支持重载,就是允许我们按照不同的方式使用同一个操作符

<3>endl是end line的意思,结束此行, 也是属于basic_ostream类的对象。加上他会换行,并且清除缓冲区内容。

二.输入一串整数和空格,实现屏蔽空格后,整数相加

1.C语言

#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
int main()
{
	int i = 0;
	int sum = 0;
	char ch = 0;
	printf("请输入一串整数和任意数目的空格:");
	while (scanf("%d", &i) == 1)
	{
		sum += i;
		while ((ch = getchar()) == ' ');//屏蔽空格
		if (ch == '\n')
		{
			break;
		}
		ungetc(ch, stdin);//将变量ch中存放的字符退回给,stdin输入流
	}
	printf("结果是:%d", sum);
	printf("\n");
	system("pause");
	return 0;
}

这段C语言代码里有一句我以前没有见过,ungetc(ch, stdin)此语句用于把getchar从输入流取出的字符放回输入流,以便下次其他操作从输入流中得到字符时不会出现混淆和取错

如果没有这一句代码,本身计算出来的值就会是一个错误的值

2.C++

#include<iostream>  
using namespace std;
int main()
{
	int sum = 0;
	cout << "请输入一串整数和任意数目的空格:";
	int i;
	while (cin >> i)
	{
		sum += i;
		while (cin.peek() == ' ')
		{
			cin.get();
		}
		if (cin.peek() == '\n')
		{
			break;
		}
	}
	cout << "结果是:" << sum << endl;
	return 0;
}

观察两者代码

第一,在C++里面出现了cin>>i,流对象cin   对象的类型是istream ,basic_istream,它知道如何从用户终端读取数据

cin输入操作符又称为提取操作符,它一次从输入流对象cin提取一个整数

<<这个操作符对所有内建的数据类型都进行了重载,所以可以从输入流对象提取处int,float,double型数据,也可以字符串等数据
表达式cin>>i返回输入流本身,也就是cin,  但是,如果到达了文件尾或者提取操作符遇到一个非法值,这个返回值将是false

第二,cin.peek(),其返回值是一个当前指针指向的char型字符,但是只是观测,指针不移动

cin.get(),解释它,本身要提起cin,cin的输入遇到空格的时候会结束,而在这里,cin.get(无字符)的作用是舍弃输入流不需要的字符空格。

int main()
{
	char p;
	cout << "请输入一段文本:\n";
	while (cin.peek() != '\n')//观测一个字符
	{
		cout << (p = cin.get());//输出字符
	}
	cout << endl;
	return 0;
}

而在上面的代码里,p=cin.get()相当于cin.get(p),cin.get(字符变量名),可以用来接收字符

还有一种用法是接收字符数组

int main()
{
    char arr[10];
    cin.get(arr,10);
    cout<<arr<<endl;

    return 0;
}

比如输入abcdefghigk,就会输出abcdefghi(九个字符)和一个\0(终止符)

三.一些扩展

1.cin.ignore() & cin.getline()

int main()
{
	char buf[20];
	cin.ignore(7);//忽略七个字符
	cin.getline(buf, 10);//获取十个
	cout << buf << endl;
	return 0;
}

 cin.ignore(7)的作用是忽略七个字符,也就是输出的时候从第八个字符开始

cin.getline(buf,10),也就是从buf里面获取十个字符

通过查询了解,cin.getline(字符数组名,字符个数,结束字符)

如果在上面代码里,输入abcdefghi

cin.getline(buf,5,f)  结果为abcd,第五位是\0

cin.getline(buf,5,b) 结果为ab

2.cin.gcount() & cin.read()&cout.write()

int main()
{
	const int SIZE = 50;
	char buf[SIZE];
	cout << "请输入一段文本:";
	cin.read(buf, 20);//读取20个字节

	cout << "字符串收集到的字符数为:"
		<< cin.gcount() << endl;//计算提取的字符

	cout << "输入的文本信息是:";
	cout.write(buf, 20);//从缓冲区输出二十个字符
	cout << endl;

	return 0;
}

 cin.read(buf, 20),是提取20个字节

cin.gcount()计算提取的字符数

cout.write(buf, 20)从缓冲区输出20个字符,如果为cout.write(buf,5),输入abcdef,输出abcde五个字符

3.cout.precision() & cout.width()和cin.width

#include<iostream>  

using namespace std;
#include<math.h>
int main()
{
	double result = sqrt(3.0);
	cout << "对3开放保留小数点后0~9位,结果如下:\n" << endl;
	for (int i = 0;i <= 9;i++)
	{
		cout.precision(i);
		cout << result << endl;
	}
	cout << "当前的输出精度为:" << cout.precision() << endl;
	return 0;
}

sqrt()函数是用来求给定值的平方根,这里需要引用头文件#include<math.h>

函数原型是double sqrts(double x);

cout.precision()是输出流cout的格式控制函数,cout.precision(数字)里面的数字控制精度

cout.precision()返回当前浮点数的精度值

int main()
{
	int width = 4;
	char str[20];

	cout << "请输入一段文本:\n";
	cin.width(5);

	while (cin >> str)
	{
		cout.width(width++);
		cout << str << endl;
		cin.width(5);
	}

	return 0;
}

cin.width(5)将字符串全部读取,输出四个字符和一个\0,遇见空格视为结束

cout.width(5)输出四个字符和一个\0,右对齐,遇见空格视为结束

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值