【问题标题】:Is accessing an element of an array using a post-incremented variable undefined behavior in C++?是否使用 C++ 中的后递增变量未定义行为访问数组元素?
【发布时间】:2017-04-10 00:09:19
【问题描述】:

我已经阅读了一些 stackoverflow 问题,这些问题在函数调用中发布或预递增变量会导致未定义的行为。

既然在向量中,数组元素访问操作符operator[]()是一个函数调用,下面的代码示例也是这样吗?

double p_step = 1.0 / (double)_progress_bar_chars.size();
int ixx = 0;
for(double p = 0.0; p < 1.0; p += p_step)
    _progress_bar_chars[ixx ++] = (p <= progress ? '=' : ' ');

上面的代码会产生未定义的行为吗?

供参考:

std::vector<char> _progress_bar_chars;
_progress_bar_chars.resize(50);
double progress = 0.5;

最后,我在这里使用 std::vector 而不是纯数组或堆分配数组是否重要?

【问题讨论】:

  • 这样使用不会导致未定义的行为,也许this page可以帮助你更多
  • 由于_progress_bar_chars[ixx ++]_progress_bar_chars.operator[](ixx ++) 相同,我会说这个问题可能与stackoverflow.com/questions/598148/… 重复

标签: c++ vector undefined-behavior post-increment


【解决方案1】:

使用前置或后置增量不会影响代码的有效性。

唯一重要的是结果索引在向量或数组的范围内

【讨论】:

    【解决方案2】:

    当你增加同一个变量两次时会出现问题,例如:

    foo(i++, i++);
    

    在这种情况下,第二个是未定义的

    使用 operator[] 时没有未定义的行为。

    欲了解更多信息:Is it legal to use the increment operator in a C++ function call?

    【讨论】:

    • 更具体地说,未定义函数参数的评估顺序,因此任何具有“副作用”的参数都有潜在的危险。
    • @SvenNilsson: 鉴于 f1() 中的 foo((*f1())++, ((*f2())++) 操作不能与任何其他操作交错,f2() 中的操作同样如此,但是在返回的地址上的读取-修改-写入序列这些功能可能会以有问题的方式交错。如果同一个函数调用的参数列表中的两个事物都递增,则只有当它们不相交时才会定义行为。否则代码可能会调用鼻恶魔。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2020-09-26
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2018-09-16
    • 2012-06-20
    相关资源
    最近更新 更多