C++ 在主方法中声明与从主方法外部声明时的其他结果
我目前正在做一个简单的问题。 基本上,您会得到一个字符串(例如“1+3+2”),您必须按顺序返回它(例如“1+2+3”)。仅使用1、2和3 我从以下几点开始:C++ 在主方法中声明与从主方法外部声明时的其他结果,c++,arrays,main,C++,Arrays,Main,我目前正在做一个简单的问题。 基本上,您会得到一个字符串(例如“1+3+2”),您必须按顺序返回它(例如“1+2+3”)。仅使用1、2和3 我从以下几点开始: #include <iostream> using namespace std; int main() { string str; int arr[4]; cin >>str; for(int i = 0; i < str.length();i+=2)
#include <iostream>
using namespace std;
int main()
{
string str;
int arr[4];
cin >>str;
for(int i = 0; i < str.length();i+=2)
arr[str[i] - '0']++;
}
#包括
使用名称空间std;
int main()
{
字符串str;
int-arr[4];
cin>>str;
对于(int i=0;i
我的想法是将出现的每个数字存储在一个数组中。但我注意到一个问题,如果我要添加
cout<< arr[2];
cout>str;
对于(int i=0;i cout您没有初始化int-arr[4]在您的第一个示例中,是code>因此,程序的行为未定义。
如果在没有第一个for循环的情况下打印arr
的内容:
for (auto x: arr) {
std::cout << x << "\n";
}
但你不能保证得到任何东西。如果您为编译器提供了一个无效的程序,那么它可以随心所欲地执行任何操作
您可以通过初始化数组来解决此问题:
int arr[4] = {};
该值将初始化数组,对于int
而言,这意味着使用0
自动存储持续时间进行初始化,不使用初始化器:默认初始化适用:基本非类类型的数组将保留未初始化值
在第一个示例中,arr
具有自动存储持续时间,并且由于默认初始化而未初始化:
int main() {
// default initialization
int arr[4];
// reading from arr at this point (remains
// uninitialized) is undefined behaviour.
}
数组类型的默认初始化的效果是数组的每个元素都是默认初始化的。默认初始化对基本非类类型的影响是没有的:元素将保持未初始化状态。从这些元素中读取(对示例中的元素调用operator++
)是未定义的行为
例如,可以使用以下语法初始化值arr
:
int main() {
int arr[4]{};
}
其效果是数组的每个元素都是值初始化的,这反过来又会使数组的每个元素(基本非类类型)都是零初始化的
静态存储持续时间:零初始化适用
在第二个示例中,arr
不再具有自动存储持续时间,而是具有静态存储持续时间,并且静态初始化规则适用,这将导致arr
初始化为零。C++默认情况下不会将数组初始化为0。您的初始内容是不可预测的,您的结果也是如此
有多种方法可以解决这个问题。我建议使用,声明变量如下:
#include <vector>
std::vector<int> arr(4, 0);
#包括
std::向量arr(4,0);
第一个参数是大小,第二个参数是所有元素的初始值(默认值为0)。您可以将其用作带有[]的数组。它还具有其他有用的功能,例如,如果需要,可以进行扩展
或者,也可以使用清除阵列:
#include <cstring>
memset(arr, 0, sizeof(arr));
#包括
memset(arr,0,sizeof(arr));
此函数较旧,您需要更加小心。您应该检查变量初始化。默认情况下,int
包含垃圾
#include <vector>
std::vector<int> arr(4, 0);
#include <cstring>
memset(arr, 0, sizeof(arr));