为什么 C++ 数组不能超过第四个元素?

Why does the C++ array not work beyond the 4th element?

我正在学习 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;
}

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

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

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

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

 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