请有人解释一下i = x[i]++;是否会导致未定义的行为?
注意:x[i]和i都不是易失性的,x[i]不重叠i。
这里有C11,6.5个表达式,2(重点是添加的):
如果对标量对象的副作用相对于同一标量对象上的不同副作用或使用相同标量对象值计算的值而言没有排序,则行为是未定义的。如果表达式的子表达式有多个允许的命令,则如果在任何顺序中发生这种未排序的副作用,则行为是未定义的。84)
据我所知:
没有“不同的副作用对同一个标量object"
”
是否有“多个允许订货”?
总体上:如何解释i = x[i]++;。序列点、副作用和未定义的行为(如果有的话)?
UPD。结论:i = x[i]++;可引起2种不良反应:
“操作数对象的值递增”( increment)
标准没有定义副作用发生的顺序。
因此,根据C11,4.一致性,2:
未定义行为在本国际标准中以“未定义行为”一词表示,或通过省略对行为的任何明确定义表示。
实验表明,GCC/LLVM/ICC具有顺序1-2,而MSVC (及其他一些)具有顺序2-1。
额外的(推测):为什么不使它不明确的行为?示例:“未指定行为的一个示例是副作用发生的顺序”?
发布于 2022-04-12 13:38:52
想象一下:
i = 3;
x[] = {1, 1, 1, 1, 1};因此,x[i] = 1,x[i]++ =2,x变为{1, 1, 2, 1, 1},i变为1。
为什么会有不明确的行为呢?
https://stackoverflow.com/questions/71843405
复制相似问题