此增量后语句是否会导致未定义的行为?

Does this post-increment statement result in undefined behaviour?

本文关键字:未定义 语句 是否      更新时间:2023-10-16

使用较新版本的GCC构建程序时,我发现代码中存在问题。

count[i] = count[i]++;

此代码适用于较旧版本的 GCC (2.95(,但不适用于较新版本 (4.8(。

所以我怀疑这种说法会导致未定义的行为,我说得对吗?还是有更好的术语来解决这个问题?

这实际上被指定为未定义的行为,因为每个编译器都定义了自己的操作顺序,如: https://en.cppreference.com/w/cpp/language/eval_order

未指定几乎所有C++运算符的操作数的计算顺序(包括函数调用表达式中函数参数的计算顺序和任何表达式中子表达式的计算顺序(。编译器可以按任意顺序计算操作数,并且可以在再次计算同一表达式时选择其他顺序。

在cpp首选项的递增/递减页面上实际上有一个警告:https://en.cppreference.com/w/cpp/language/operator_incdec

由于涉及的副作用,必须谨慎使用内置的递增和递减运算符,以避免由于违反排序规则而导致的未定义行为。

事实上,这是未定义的行为。

int i = 2;
i = i++; // is i assigned to be 2 or 3?