`a ++&f(a)`未定义或未指定?

And*_*eas 1 c undefined-behavior

这是Deep C的一个例子(幻灯片194)

int a = 41;
a++ & printf("%d\n", a);
Run Code Online (Sandbox Code Playgroud)

该演示文稿声称结果未定义.为什么?a仅在序列点之间分配一次.我认为a++和之间的执行顺序printf是未指定的,因此这将在所有符合要求的编译器上打印41或42,没有未定义的行为.

Sad*_*que 5

在这一行中 - a++ & printf("%d\n", a);只有一个序列点(不计算函数参数中a++1发生的事情- 因为在这一行本身发生) - 修改一个变量并在一个序列点内同时读取它是UB.如果从对象读取先前的值但是也存在修改,则行为未定义,如i * i++

&&是一个序列点,&如果你感到困惑的话,它不是一个序列点.

序列点是尘埃沉降的时间点,并且到目前为止所见的所有副作用都保证完整.C标准中列出的序列点是:

在完整表达式的评估结束时(完整表达式是表达式语句,或任何其他表达式,它不是任何更大表达式中的子表达式); 在||,&&,?:和逗号运算符; 并在函数调用(在所有参数的评估之后,以及在实际调用之前).

标准规定了这一点

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,只能访问先前值以确定要存储的值.