为何C库函数需序列点保证?是否属于冗余规定?
C标准中函数调用序列点的冗余规定疑问
我正在查阅C23标准草案,但认为该问题同样适用于C11标准。C语言中存在若干与函数调用相关的序列点保证,例如:
- 任何库函数返回前存在序列点
- 排序与搜索算法调用比较函数的间隔处存在序列点
我感觉自己有所遗漏,因为根据我的理解,我们并不需要这些保证——已有标准条款6.5.2.2.8明确说明:
在函数指示符和实际参数的求值之后、实际调用之前存在一个序列点。调用函数中的所有未被明确指定在被调用函数体执行之前或之后进行的求值(包括其他函数调用),与被调用函数体的执行是不确定顺序的。
按我的理解,这意味着任何库函数返回前、任意比较函数调用之间都存在序列点(或等效效果)。因此我们不需要这些特定保证。这是(略显令人困惑的)冗余规定,还是我遗漏了什么?
编辑补充:
下方评论给出了库函数返回保证的两个合理原因:
- 库函数可能是宏实现
- 库函数可能用汇编编写
但关于比较函数调用彼此之间(以及排序时的元素移动)由序列点分隔的保证,疑问仍然存在。目前看来这只是一项冗余保证,或许确实没有更多深意。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

