我在C语言中并没有那么高级,但我在一段代码中发现了这一点

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

这是什么意思?
在这种情况下我们真的能做到吗?

最佳答案

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

上面这一行没有任何意义,因为它是Undefined Behavior (UB)
因此,答案是坚决的不!.
为什么?
因为ret写了两次,并且没有中间的序列点。
ret的实际增量可以在读取它以确定--ret的值之后和结束分号之前的任何时间发生。
因此,它与赋值ret += ...的变化相冲突。
此外,读取ret中的ret += ...与更新ret中的--ret冲突)
另外,在C++中,由于C++ 11(顺序而不是序列点),它将被明确定义。

关于c - 这在C语言中正确吗? (禁止对变量编译器执行错误操作),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27994843/

10-11 23:06
查看更多