这在 C 中是正确的吗? (对变量编译器错误的禁止操作)

is this right in C? (forbidden operation on a variable compiler error)

我在 C 语言方面并不是那么先进,但我在一段代码中发现了这一点

ssize_t ret = 0;
ret += sprintf(buf + --ret, "\n");

这是什么意思?
在这种情况下我们真的可以 --ret 吗?

ret += sprintf(buf + --ret, "\n");

上面这行没有任何意义,因为是Undefined Behavior (UB).

因此,答案是肯定的不!

为什么?

因为ret写了两次,没有中间的sequence-point

(ret的实际增量可以随时发生在读取它确定--ret的值之后和结束分号之前。
因此,它与分配 ret += ....
的更改冲突 此外,ret += ...中的ret的读取与--ret中的ret的更新冲突。)

顺便说一句,在 C++11 之后的 C++ 中(排序而不是序列点)它会被明确定义。