C语言字符语法的常见陷阱
比如说
int main()
{
string c1( 1,'yes' );
string c(3, 'yes');
cout << c1 << endl;
cout << c<< endl;
return 0;
}
你会发现,首先第一行本来应该是不能通过的,但是没用那个{}去定义,然后用=定义的话,不会有那么多格式限制,字符依然会被存储,但是会截断,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库,里边有这个大数运算的函数可以直接用