首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以下C程序的行为是否未定义?

以下C程序的行为是否未定义?
EN

Stack Overflow用户
提问于 2018-08-31 22:30:20
回答 1查看 110关注 0票数 1

我正在寻找我的一个老课程,我发现以下几点:

代码语言:javascript
复制
int main(void) {
    int x = 0;
    return (x = 1) + (x = 2);
}

“根据C标准,上述程序的行为是未定义的。

GCC4,MSVC:返回4

GCC3,ICC,Clang:返回3“

在这之后有一张幻灯片说,下面的代码在C标准中不是未定义的。有人能向我解释一下为什么这不是不明确的行为吗?

代码语言:javascript
复制
int main(void) {
    int x = 0;
    int y = 2;
    return (x = 4) + (x=(x + y)/2);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-31 22:34:23

C规范的相关段落:

如果A和B在B之前排序,则A的执行应先于B的执行(相反,如果A在B之前排序,则B在A之后进行排序)如果A在B之前或之后没有排序,则A和B不被排序。

如果对标量对象的副作用相对于对同一个标量对象的不同副作用或使用同一个标量对象的值计算没有排序,则行为是未定义的。如果表达式的子表达式有多个允许的顺序,则如果在任何命令中出现这种未排序的副作用,则该行为是未定义的。

因此,问题中的两个片段都会调用未定义的行为。

(因为最初您的第二个片段是C++,因此值得一提的是,尽管C++的最新版本已经扩展了“之前排序”和“后面排序”的概念,但AFAIK仍然没有将operator+作为序列点。)

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

https://stackoverflow.com/questions/52123271

复制
相关文章

相似问题

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