为什么在C++不可能递增或进行数学运算,例如在声明为数组的变量上乘法



为什么在C++中,声明为数组的变量可以用整数加减,但不能递增(++(或递减(--(或乘以数字等,即使变量存储数组的起始地址? 例如

#include <iostream>
using namespace std;
int main()
{
int x[] = {12,33,41,55,68};
cout<<x<<"n";          // Output : 0x7af786c84320
cout<<x+1<<"n";        // Output : 0x7af786c84324
cout<<x+1000<<"n";     // Output : 0x7af786c852c0
cout<<x-1000<<"n";     // Output : 0x7af786c83380
cout<<x*1<<"n";        /* Output : invalid operands of types  
'int[5]' and 'int' to binary 'operator*' */
cout<<x*2<<"n"; 
cout<<x++<<"n";        /* Error :  lvalue required as increment 
operand */
cout<<x--<<"n";
x=x;                    //Error : invalid array assignment
cout<<x<<"n";
return 0;
}

如果有人能解释详细声明数组时会发生什么,那就更好了。 以及为什么在所有算术运算中只有"+"和"-"有效,而不是"*"或其他。

需要注意的几点:

  1. int main替换为int main()(以正确声明函数(
  2. int x={2,3,4,5,6}替换为int x[]={2,3,4,5,6};(以正确声明数组(
  3. 数组不能递增
  4. ,但数组的指针可以递增。(见下文(
  5. 我假设您要打印数组第一个元素的值,而不是第一个元素的地址。
  6. 确保以分号终止所有行。
  7. 从技术上讲,main功能应在成功完成后return 0

综上所述,以下代码应该可以完成此操作。

int main() {
int *y, x[] = {2,3,4,5,6};
y = x;
cout << *y++;
return 0;
}

现在,逐行检查此内容

  1. 声明一个指向 int (y的指针 (,声明一个 int 数组 (x(,然后初始化该数组。
  2. y设置为等于x(即将数组的地址存储在y中(。
  3. 取消引用y(即获取该地址处整数的值(,打印它,然后递增y指向x中的下一个元素。

不,变量不存储任何内容的地址;它存储整个数组。

递增指针是有意义的,但数组不是指针。

当你说

int x[] = {2,3,4,5,6};

你在记忆中得到的是

[ 2 ][ 3 ][ 4 ][ 5 ][ 6 ]

(连续 5 个整数(。x指的是整个事情;没有通过指针或任何东西的间接寻址。

大多数数组包含不能递增或相乘的东西 因此,递增或乘以数组没有任何意义 一般情况。

有(很少使用(std::valarray模板假设其 元素是算术类型,支持整体算术运算 数组:

#include <iostream>
#include <valarray>
int main()
{
std::valarray<int> x = {2,3,4,5,6};
x += 1;
for (auto v : x) std::cout << v << " ";
std::cout << "n";
x *= 2; 
for (auto v : x) std::cout << v << " ";
std::cout << "n";
}

输出为:

3 4 5 6 7 
6 8 10 12 14 

最新更新