在主方法中声明与主方法之外时的其他结果

时间:2020-08-28 10:53:07

标签: c++ arrays main

我目前在codeforce上做了一个简单的问题。 基本上,您会得到一个字符串(例如“ 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']++;    
}

我的想法是将每次出现的数字存储在数组中。但是我发现如果我要添加一个问题

cout<< arr[2];

并输入“ 1 + 2 + 3”,它输出:

33

但是,它应该为1,因为3只出现一次。

我通过移动“ string str;”解决了它。然后在main上方“ int arr [4]”

#include <iostream>
using namespace std;

string str;
int arr[4];

int main()
{   
    cin >>str;

    for(int i = 0; i < str.length();i+=2)
        arr[str[i] - '0']++;
    cout<< arr[2];
}

输出:

1

为什么现在可以使用?

3 个答案:

答案 0 :(得分:0)

在第一个示例中,您没有初始化int arr[4];因此,您的程序的行为是不确定的。

如果在没有第一个for循环的情况下打印arr的内容:

for (auto x: arr) {
  std::cout << x << "\n";
}

您得到的垃圾数据恰好位于arr的地址:

121
32584
615125669
22063

但是您不能保证得到任何东西。如果您为编译器提供了无效的程序,则可以随意执行该操作。


您可以通过初始化数组修复

int arr[4] = {};

这将对数组进行初始化,这对于int来说是用0进行初始化。

答案 1 :(得分: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被初始化为零。

答案 2 :(得分:0)

C ++默认不会将数组初始化为0。您的初始内容是无法预测的,与您的结果相同。

有多种方法可以解决此问题。我建议使用std::vector,将变量声明为:

#include <vector>
std::vector<int> arr(4, 0); 

第一个参数是大小,第二个参数是所有元素的初始值(默认为0)。您可以使用[]将其用作数组。它具有其他有用的功能,例如可以根据需要进行扩展。

或者,您也可以使用memset清除数组:

#include <cstring>
memset(arr, 0, sizeof(arr));

此功能较旧,您需要多加注意。