c ++为啥在指数时不打印所有元素
Posted
技术标签:
【中文标题】c ++为啥在指数时不打印所有元素【英文标题】:c++ why dont print all elements when exponentc ++为什么在指数时不打印所有元素 【发布时间】:2017-12-27 10:51:13 【问题描述】:我想创建一个数组并将该数组中的每个元素提升 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++ 中没有指数运算符。为什么要猜测语法? 你需要一个或多个these。 @StoryTeller。谢谢先生的解释。我一定会学的。 【参考方案1】:**
是不是指数运算符。 C++ 不是 Fortran。
您将arr
的第一个元素乘以2:您的语句等效于int arr2 = 2 * arr1[0];
。您输入的是完全合法的 C++(包括乘法和指针解引用),而使用 auto
会增加混淆。
【讨论】:
谢谢,看来你是对的,我一直想知道为什么**
对两个常量不起作用
这应该加入-->
“运营商”拥有的专属俱乐部。
@StoryTeller :也是“转换为布尔”运算符:!!
【参考方案2】:
此声明
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
【讨论】:
【参考方案3】:做你想做的最简单的方法就是这样。
#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.
【讨论】:
是的,谢谢,其他的答案已经解释的很好了,但是你的答案也是有效的,所以谢谢。以上是关于c ++为啥在指数时不打印所有元素的主要内容,如果未能解决你的问题,请参考以下文章
C-为啥Struct数组的冒泡排序会跳过Array中的第一个元素?