首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这些赋值之间是否存在序列点?

这些赋值之间是否存在序列点?
EN

Stack Overflow用户
提问于 2011-09-09 10:34:04
回答 6查看 516关注 0票数 15

以下代码中的两个赋值之间是否存在序列点:

代码语言:javascript
复制
f(f(x=1,1),x=2);
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-09-27 19:12:45

the (draft) standard 6.5.2.2,10中的相关引用是:

未指定函数指示符、实际参数和子表达式在实际参数中的求值顺序,但在实际调用之前有一个序列点。

因此,对于您的表达式,第一个参数(特别是对f的调用)可以在第二个参数之前进行计算;例如:

代码语言:javascript
复制
(x = 1, 1), f <sp> call, (x = 2), f <sp> call

或者,可以在第二个参数之后对其求值;例如:

代码语言:javascript
复制
(x = 2), (x = 1, 1), f <sp> call, f <sp> call

函数调用本身可以(并且很可能会)包含更多的序列点(特别是如果它包含一条return语句)。

根据这一点,赋值之间是否存在序列点。这取决于平台(“未指明”)。

由于在第二种情况下,您在两个序列点之间为x赋值两次,因此您在这样的平台上具有未定义的行为。

票数 3
EN

Stack Overflow用户

发布于 2011-09-09 10:42:02

没有。在这种情况下,标准确实是模棱两可的。

如果你想确认这一点,gcc有一个非常酷的选项-Wsequence-point,在这种情况下,它会警告你,操作可能是未定义的

票数 5
EN

Stack Overflow用户

发布于 2011-09-27 16:27:28

在函数调用的开头和结尾都有序列点。但是,因为函数参数上的操作顺序是由实现定义的,所以不能保证f(x=1,1)将在x=2之前执行。

还要注意,函数调用中的,不是引入序列点的逗号运算符。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7356573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档