【问题标题】:Why does the C++ array not work beyond the 4th element?为什么 C++ 数组在第 4 个元素之后不起作用?
【发布时间】:2021-11-18 05:29:36
【问题描述】:

我正在学习 C++,并且有一个要求取两个数字并将它们插入数组的作业。第一个数字是基数,第二个数字是数组长度。数组的长度是底数乘以指数的次数。
例如,如果基数为 2,数组长度为 4,则元素 0 为 1,元素 2 为 2,以此类推,输出为 2、4、8、16。
这很有效,直到输入任何基数,然后是 5。如果长度为 5 或更大,我会正确获得前四个元素,那么后面的所有元素都是 0。

这是我想出的代码,但没有按预期工作。

#include <iostream>
using namespace std;

int main() {
    int power, powarray[power];
    double base;

    while(power >= 0) {
        cout << "Please enter a base number.\n";
        cin >> base;
        cout << "Please enter your exponent.\n";
        cin >> power;
 
        if (power <= 0) { 
            cout << "Please enter a nonnzero power\n";
        } else if (power > 0) {
            for(int n = 0; n < power; n++) {
                //powarray[0] = base;
                powarray[n] = base * powarray[n-1];

                cout << powarray[n] << endl;
            }
        }
    }

  return 0;
}

【问题讨论】:

  • 几个原因,powarray[power] 仅当 power 为常数时才是标准 C++。可变长度数组最好使用 std::vector 初始化。而且你没有用值初始化数组(C++不会自动用0初始化变量)
  • 要在 C++ 中使用变量,您需要声明并初始化该变量的默认值。未经初始化声明的变量可以分配任意值。你只是声明power而不初始化它,所以你第一次使用它 数组长度可以是任意的,在其他机器上,它可能是5、7,无效...
  • int power, powarray[power]; 这在很多层面上都是错误的:VLA 在 C++ 中无效,power 在使用时未初始化

标签: c++ arrays exponent


【解决方案1】:

我会先修复你的代码缩进,让代码块更清晰:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int power, powarray[power];
 7     double base;
 8  
 9     while(power >= 0) {
10
11         cout << "Please enter a base number.\n";
12         cin >> base;
13         cout << "Please enter your exponent.\n";
14         cin >> power;
15      
16         if (power <= 0) {
17             cout << "Please enter a nonnzero power\n";
18          
19         } else if (power > 0) {
20      
21             for(int n = 0; n < power; n++) {
22          
23                 //powarray[0] = base;
24                 powarray[n] = base * powarray[n-1];
25                 cout << powarray[n] << endl;
26             }
27         }
28     }
29  
30     return 0;
31 }

现在,主要问题如下:

  1. 您甚至在初始化之前尝试使用两次power 变量的值(行69)。正如其他人提到的,在 C++ 中,您不能使用这样的变量初始化数组。从简单开始,使用常量初始化数组最大大小(例如,100)。 9 行没有多大意义,去掉这个while 循环;

  2. for 循环的第一次迭代中,n 等于0,因此24 行将尝试从powarray 获取负索引。这是无效的;

  3. 代码结构混乱。让我们把它分成三个部分来整理一下: 1:获取输入; 2:填充数组,计算成员值; 3:打印数组。另外,删除注释代码。

这些导致这样的事情:

#include <iostream>
using namespace std;

int main()
{   
    int power;
    double base;
    int powarray[100];

    /* Get and validate user input */
    cout << "Please enter a base number: ";
    cin >> base;
    cout << "Please enter your exponent: ";
    cin >> power;
    if (power <= 0 || power > 100) {
        cout << "Please enter a positive power not exceeding " << 100 << endl;
        return -1; 
    }   
    
    /* Fill array */
    for (int n = 0; n < power; n++) {
        if (n > 0)
            powarray[n] = base * powarray[n - 1]; 
        else
            powarray[n] = base;
    }   

    /* Print array */
    cout << "Array = ";
    for (int n = 0; n < power; n++) {
        cout << powarray[n] << " ";
    }   
    cout << endl;

    return 0;
}

这是一个示例输出:

$ ./a.out 
Please enter a base number: 2
Please enter your exponent: 12
Array = 2 4 8 16 32 64 128 256 512 1024 2048 4096 

【讨论】:

    【解决方案2】:

    您错误地假设该数组适用于最多 4 个索引,您只是运气不好,没有观察到任何较小尺寸的明显不当行为。

    您在某个时候确实观察到不当行为的原因:

    • 您在 C++ 中使用 C 样式数组,这绝不是明智之举。
    • 您使用的是非 C++ VLA(可变长度数组)。
    • 您使用不正确,即使在 C 语言中,它也无法使用未初始化的变量作为大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 2021-06-06
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2013-04-26
      相关资源
      最近更新 更多