C++ 在主方法中声明与从主方法外部声明时的其他结果

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)

我目前正在做一个简单的问题。 基本上,您会得到一个字符串(例如“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)
        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;icout您没有初始化
int-arr[4]因此,程序的行为未定义。

如果在没有第一个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));