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

以下C程序的行为是否未定义?,c,C,我正在查找我的一门旧课程,我发现: int main(void) { int x = 0; return (x = 1) + (x = 2); } “根据C标准,上述程序的行为尚未定义 GCC4,MSVC:返回4 GCC3、ICC、Clang:返回3“ 在这之后有一张幻灯片说下面的代码在C标准中不是未定义的。谁能向我解释为什么这不是未定义的行为 int main(void) { int x = 0; int y = 2; return (x = 4) +

我正在查找我的一门旧课程,我发现:

int main(void) {
    int x = 0;
    return (x = 1) + (x = 2);
}
“根据C标准,上述程序的行为尚未定义

GCC4,MSVC:返回4

GCC3、ICC、Clang:返回3“

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

int main(void) {
    int x = 0;
    int y = 2;
    return (x = 4) + (x=(x + y)/2);
}

C规范中的相关段落:

给定任意两个评估A和B,如果A在B之前排序,则A的执行应在B的执行之前。(相反,如果A在B之前排序,则B在A之后排序。)如果A未在B之前或之后排序,则A和B未排序。

如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值计算未排序,则行为未定义。如果表达式的子表达式存在多个允许的顺序,如果在任何医嘱中发生此类未排序的副作用,则该行为未定义


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


(因为您的第二个片段是C++),值得一提的是,尽管最近的C++版本已经扩展了“先排序”和“后排序”的概念,但它仍然不包括“代码>操作符+<代码>作为序列点。

< P> C规范的相关段落:

给定任意两个评估A和B,如果A在B之前排序,则A的执行应在B的执行之前。(相反,如果A在B之前排序,则B在A之后排序。)如果A未在B之前或之后排序,则A和B未排序。

如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值计算未排序,则行为未定义。如果表达式的子表达式存在多个允许的顺序,如果在任何医嘱中发生此类未排序的副作用,则该行为未定义


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


(因为你的第二个片段是C++),值得一提的是,尽管最近的C++版本已经扩展了“先排序”和“后排序”的概念,但它仍然不包括“代码>运算符+ < /代码>作为序列点。”

我建议不要做。你的问题和你问的问题不匹配。也就是代码> CUT<代码>是C++,所以我可能…不相信这些信息(你显然不是,既然你在这里问它。好工作!)@ JasonCHAN“不做它”。这是很好的建议,但是却在探索语言的角落。了解它的局限性是很好的。值得一读,现在的C++ C++已经被删除了。“我的旧课程”>什么课程断言<代码>(x=4)+(x=(x+y)/2)< />不是没有定义的吗?我建议不要做。你的问题和你问的问题不匹配。(显然你不是,因为你在这里问它。好工作!)JasonCHAN“不做它。”是好的建议,但是探索语言的角度,理解它的局限性是好的。值得一个UV,现在C++的删除。“我的旧课程”>什么课程断言<代码>(x=4)+(x=(x+y)/ 2)< /> >不是未定义的?