我想创建一个数组并向该数组中的每个元素引发2并将其存储为新数组arr2。这是我的代码
#include <iostream>
using namespace std;
int main(){
int arr1[7] = {1, 2, 3, 4, 5, 6, 7};
auto arr2 = 2 ** arr1;
cout << arr2 << endl;
}
但是,它只打印第一个元素,它不打印整个数组。为什么?所以,基本上,我在这里做的是用元素{1,2,3,4,5,6,7}创建arr1然后我想要arr2是
但由于某种原因,它只打印数组的第一个元素,它打印2,但我希望它打印所有元素。请注意,2 ** arr1
是我将2提升为幂的行(使用取幂运算符,我认为如果我没有错,就是你如何调用它)然后它应该将数组存储在array2中。
有什么问题,为什么它只打印第一个元素而不是所有元素?
这个说法
auto arr2 = 2 ** arr1;
相当于
auto arr2 = 2 * *arr1;
表达式中的数组指示符(很少例外)转换为指向其第一个元素的指针。
所以上面的陈述可以改写成
auto arr2 = 2 * *( &arr1[0] );
由于arr1
数组的第一个元素等于1,所以你有
auto arr2 = 2 * 1;
表达式2 * 1
的类型为int
。
因此,语句可以像重写一样重写
int arr2 = 2;
在C ++中没有像**
这样的运算符。相反,你必须使用标准功能pow
。
您可以通过手动编写适当的循环或使用标准算法std::transform
来完成任务。
这是一个示范计划
#include <iostream>
#include <cmath>
#include <algorithm>
#include <iterator>
int main()
{
int arr1[] = { 1, 2, 3, 4, 5, 6, 7 };
int arr2[sizeof( arr1 ) / sizeof( *arr1 )];
std::transform(std::begin(arr1), std::end(arr1),
std::begin(arr2),
[](int x) { return pow( 2, x ); });
for (int x : arr1) std::cout << x << ' ';
std::cout << std::endl;
for (int x : arr2) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
它的输出是
1 2 3 4 5 6 7
2 4 8 16 32 64 128
qazxsw poi不是指数运算符。 C ++不是Fortran。
你用**
的第一个元素乘以2:你的陈述相当于arr
。你输入的是完全合法的C ++(由乘法和指针取消引用组成),并且int arr2 = 2 * arr1[0];
的使用增加了混淆。
做你想做的事最简单的方法就是这样。
auto