我在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/