这在 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++ 中(排序而不是序列点)它会被明确定义。
我在 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++ 中(排序而不是序列点)它会被明确定义。