Does this code in C fall into the Undefined Behavior category?

前端 未结 4 902
余生分开走
余生分开走 2021-01-12 10:36

a is an array, foo is a function, and i is an int.

a[++i] = foo(a[i-1], a[i]);

Would

4条回答
  •  不要未来只要你来
    2021-01-12 10:49

    The behavior is undefined, but it's not because of the modification of the same object twice between two sequence points but it is UB because the side effect on i is unsequnced relative to the value computation of a[i-1] and a[i] using i.

    §6.5-p(2):

    If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.84)

    For example, expression

    a[i++] = i;
    

    invokes undefined behavior. Same is true for

    a[++i] = foo(a[i-1], a[i]);
    

提交回复
热议问题