代码之家  ›  专栏  ›  技术社区  ›  Dilip Kumar

数组索引递增a[k]=val[i++];

  •  -1
  • Dilip Kumar  · 技术社区  · 3 年前

    这是正确的赋值方式吗?

        int a[n], val[n]; 
        int i = 0, k = 0;
     
        while (i < n && k < n) 
        { 
            a[k] = val[i++];
            k++;
        }
    

    我正在尝试分配 val[i] a[k] 和增量 i++ 同样,这是否有任何未定义的行为,或者这是一种糟糕的做法?

    2 回复  |  直到 3 年前
        1
  •  2
  •   chqrlie    3 年前

    发布的代码已定义提供的行为 n 是积极的,并且相当小,不会引起 堆栈溢出 .

    请注意 i n 应该具有相同的类型以避免转换问题,例如如果 n 具有类型 size_t 值超出范围 int 这种情况几乎肯定会在定义巨大的VLA时导致未定义的行为。

    请注意,可以在同一表达式中递增两个索引变量:

        int a[n], val[n]; 
        int i = 0, k = 0;
     
        while (i < n && k < n) { 
            a[k++] = val[i++];
        }
    

    请注意,使用 for 循环和单个索引变量要简单得多,而且不易出错:

        int a[n], val[n]; 
     
        for (i = 0; i < n; i++) { 
            a[i] = val[i];
        }
    

    但请注意,的元素 val 必须在循环之前进行初始化,以避免出现未定义的行为。

        2
  •  0
  •   0___________    3 年前
    1. 您可以同时递增
       a[k++] = val[i++];
    
    1. for(...) 更适合这份工作。