【问题标题】:why in C++ it is not possible to increment or do mathematical operation like multiply on variable declared as array [closed]为什么在 C++ 中不可能对声明为数组的变量进行递增或执行数学运算,例如乘法[关闭]
【发布时间】:2019-02-01 05:32:35
【问题描述】:

为什么在 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;
 }

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

【问题讨论】:

  • 首先,int x ={2,3,4,5,6}; 不编译。
  • int main{ int 看起来像是语法错误。
  • 不带 () 的 int main 也不编译。
  • 抛开显示代码中的拼写错误,数组不能递增,因为 C++ 就是这样工作的。在 C++ 中,“增加一个数组”在逻辑上是没有意义的。那是什么意思“增加一个数组”。这种说法毫无意义。另一方面,如果您有一个指向数组的指针,您当然可以递增该指针。但是指针本身并不是数组。

标签: c++ c arrays pointers operators


【解决方案1】:

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

有(很少使用)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 

【讨论】:

    【解决方案2】:

    需要注意的几点:

    1. int main 替换为int main()(以正确声明函数)
    2. int x={2,3,4,5,6} 替换为int x[]={2,3,4,5,6};(以正确声明数组)
    3. 数组不能递增,但指向数组的指针可以。 (见下文)
    4. 我假设您要打印数组第一个元素的 VALUE,而不是第一个元素的 ADDRESS。
    5. 确保以分号结束所有行。
    6. 从技术上讲,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 中的下一个元素。

    【讨论】:

      【解决方案3】:

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

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

      当你说

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

      你在记忆中得到的是

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

      (连续 5 个整数)。 x 指整个事物;没有通过指针或任何东西的间接性。

      【讨论】:

        猜你喜欢
        • 2021-12-06
        • 2011-03-24
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        • 1970-01-01
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多