2024.11.7总结 C语言的陷阱到C++的改进

C语言字符语法的常见陷阱

比如说

int main()
{
	string c1( 1,'yes' );
	string c(3, 'yes');
	cout << c1 << endl;
	cout << c<< endl;
	return 0;
}

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/41b6bf7eded749d3845c2cd043879b82.png
你会发现,首先第一行本来应该是不能通过的,但是没用那个{}去定义,然后用=定义的话,不会有那么多格式限制,字符依然会被存储,但是会截断,abc只显示c.

第五行同样如此 string(1,a) 表示 如果使用两个参数,第一个是数量(size_t),第二个是一个字符(char)。但是很明显,可以观察到,你存储 ‘yes’,也是会截断。
这是注意的第一点!!

C语言数组退化问题!

通过一个例子来证明

//数组命名有问题   
double average2(int ar[])
{
	double result = 0.0;
	int length = sizeof(ar) / sizeof(ar[0]);
	cout << length << endl;
	for (int i = 0; i < length; i++)
	{
		result += ar[i];
	}
	return result / length;
}
//这时候传入的只是一个指针,会导致length计算错误
//处理方法如下
//数组在做参数时的退化问题   ---c语言处理  多传入一个参数
double average1(int ar[],int length)
{
	double result = 0.0;
	cout << length<<endl;
	for (int i = 0; i < length; i++)
	{
		result += ar[i];
	}
	return result/length;
}
//使用vector进行计算
double average3(vector<int>& v)
{
	double result{ 0.0 };
//	vector<int>::iterator it = v.begin();
	for (auto it=v.begin(); it != v.end(); ++it)
	{
		result += *it;
	}
	return result / v.size();

}
//使用vector进行二维计算
double average2DV(vector < vector<int>>& vv)
{
	double result{ 0.0 };
	unsigned int size{ 0 };
	for (unsigned int i = 0; i < vv.size(); ++i)
	{
		for (unsigned int j = 0; j < vv[i].size(); j++)
		{
			result += vv[i][j];
			size += 1;
			cout << vv[i][j]<<" ";
		}
		cout << endl;
	}
	return result / size;

}

int main()
{
	int ar[]{ 10,20,30,40,50,60,70,80,90,100 };
	int length = sizeof(ar) / sizeof(ar[0]);
	cout << average1(ar,length) << endl;
	vector<int> v{ 10,20,30,40,50,60,70,80,90,100 };
	cout << average3(v) << endl;
	vector<vector<int>> vv{ 8,v };
	cout << average2DV(vv) << endl;
	char aq = 65;
	cout << aq << endl;

}

C语言整数溢出问题

#include<boost/multiprecision/cpp_int.hpp>


using namespace boost::multiprecision;
int main()
{
	cpp_int i1 = 123456789;
	cpp_int i2 = 1789654123;
	cout << i1 * i2 << endl;
}

这边建议直接使用C++的boost库,里边有这个大数运算的函数可以直接用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋到亦天凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值