C中的此代码是否属于未定义行为类别?

Bit*_*tes 7 c arrays increment undefined-behavior language-lawyer

a是一个数组,foo是一个函数,i是一个int.

a[++i] = foo(a[i-1], a[i]);
Run Code Online (Sandbox Code Playgroud)

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

阵列索引++i,i-1并且i,保证是在阵列范围.

hac*_*cks 7

行为是不确定的,但它2个序列点之间不是因为相同的对象的修改的两倍,但它是UB由于对副作用i是相对于的值计算unsequnced a[i-1]a[i]使用i.

§6.5-P(2):

如果相对于对同一标量对象的不同副作用或使用相同标量对象的值进行值计算,对标量对象的副作用未被排序,则行为未定义.如果表达式的子表达式有多个允许的排序,则如果在任何排序中发生这种未测序的副作用,则行为是不确定的.84)

例如,表达

a[i++] = i;
Run Code Online (Sandbox Code Playgroud)

调用未定义的行为.同样如此

a[++i] = foo(a[i-1], a[i]);
Run Code Online (Sandbox Code Playgroud)

  • @BiteBytes; 这是正确的方法,并已定义行为. (2认同)

Vla*_*cow 5

根据C标准(6.5.16分配运营商):

语义

3 ...对操作数的评估没有排序.

因此这句话

a[++i] = foo(a[i-1], a[i]);
Run Code Online (Sandbox Code Playgroud)

导致未定义的行为.

  • 仅评估未经测序的操作数并不意味着它是UB.每个函数调用都没有对其参数进行评估. (2认同)