gpt4 book ai didi

c - C 中类型定义中的逗号分隔符是否保证顺序?

转载 作者:太空狗 更新时间:2023-10-29 16:40:52 25 4
gpt4 key购买 nike

逗号运算符具有最低的优先级和从左到右的关联性,因此这保证了如下顺序:

i = ++j, j = i++;

i 将是 2,如果 ij 是一开始都是 0。

但是,C 中类型定义中的逗号分隔符 是否也保证了顺序?比如

int i = 1, j = ++i;

最佳答案

您使用逗号运算符的示例 i =++j, j = i++; 定义明确,因为逗号运算符是一个序列点。

优先级/关联性不足以保证这一点——它们不同于求值顺序和序列点。例如,i * 2 + i++ * 3 是未定义的,因为没有序列点。


声明符之间的逗号分隔符,例如int i = 1, j = i++;,也是一个序列点。 C11 6.7.6/3、C99 6.7.5/3 涵盖了这一点:

A full declarator is a declarator that is not part of another declarator. The end of a full declarator is a sequence point.

所以在i = 1之后有一个序列点,这个代码是明确定义的。


但是,函数参数之间的逗号分隔符 f(i, i++) 不是序列点;这样代码会导致未定义的行为。


注意:在C11中,术语sequence point大多被替换为更复杂的顺序关系,以明确指定线程模型,但这不影响上述讨论。

关于c - C 中类型定义中的逗号分隔符是否保证顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30815074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com