为什么 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 }
现在,主要问题如下:
您试图在 power
变量的值初始化之前使用两次(第 6
和 9
行)。正如其他人提到的,在 C++ 中,您不能使用这样的变量初始化数组。从简单开始,使用常量初始化数组的最大大小(例如,100
)。 9
行没有多大意义,删除这个 while
循环;
在 for
循环的第一次迭代中,n
等于 0
因此行 24
将尝试从 powarray
。这是无效的;
代码结构混乱。让我们把它分成三个部分来整理一下: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
我正在学习 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 }
现在,主要问题如下:
您试图在
power
变量的值初始化之前使用两次(第6
和9
行)。正如其他人提到的,在 C++ 中,您不能使用这样的变量初始化数组。从简单开始,使用常量初始化数组的最大大小(例如,100
)。9
行没有多大意义,删除这个while
循环;在
for
循环的第一次迭代中,n
等于0
因此行24
将尝试从powarray
。这是无效的;代码结构混乱。让我们把它分成三个部分来整理一下: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