C 为什么不打印所有元素时

c++ why dont print all elements when exponent

本文关键字:元素 为什么不 打印      更新时间:2023-10-16

我想创建一个数组,并将2个数组升起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,4,8,16,32,64,128]

,但由于某些原因,它仅打印数组的第一个元素,它打印2,但我希望它打印所有元素。请注意,2 ** arr1是我将2升至电源的行(使用凸起操作员,我认为如果我没有错了,这是您调用它的方式),然后它应该存储在array2中。

什么问题是什么,为什么它仅打印第一个元素而不是所有元素?

**不是指数运算符。C 不是Fortran。

您将2乘以arr的第一个元素:您的语句等效于int arr2 = 2 * arr1[0];。您输入的内容是完全合法的C (由乘法和指针取消),auto的使用添加到混淆中。

此语句

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 

做你想做的事情的最简单方法可以是这样的。

#include<iostream>
#include<math.h>
using namespace std;
int main(){
      int arr1[7] = {1,2,3,4,5,6,7}, arr2[7];
      for(int i = 0; i<7; i++){
          arr2[i] = pow(2, arr1[i]);    //arr2 will be created.
          cout<<arr2[i]<<" ";           //Show arr2.
          }
}