Skip to content

UB34

definition⚓︎

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.

针对同一个标量对象,两个副作用的作用顺序不确定,或者一个副作用与一个求值的作用顺序不确定。

description⚓︎

给定一个表达式(Expression),Evaluation过程包括:

Value Computation (求值),即表达式的value(值+类型);

Initiation of Side Effect(确定副作用),即表达式造成的影响。

在下面 i = i++ 的例子中,表达式 i++ 的 Value Computation 是<0, int>, Side Effect 是 i 自增1;表达式i = i++ 的 Value Computation 是<0, int>,Side Effect 是 i 变为0。然而此处的两个 Side Effect 作用的先后顺序没有具体要求,那么赋0与自增的先后顺序不同会影响 i 的结果。

在下面 i = i + i++ 的例子中,表达式 i++ 的 Value Computation 是<0, int>, Side Effect 是 i 自增1;表达式 i 的Value Computation,若发生在 i 自增前则为<0, int>,若发生在 i 自增后则为<1, int>。此时求值与副作用发生的先后顺序会影响最终的结果。

code⚓︎

#include<stdio.h>

int main(){
    int i = 0;
    i = i++;        //undefined behavior
    i = i + i++;    //undefined behavior
    printf("%d", i);

    return 0;
}