关于c ++:`y = ++ y`,这个标准是否合规?

`y=++y`, is this standard compliant? [which appears in a test by Microsoft]

本问题已经有最佳答案,请猛点这里访问。

我知道这看起来很熟悉,但在微软招聘实习生的测试中,这对我来说是个问题。在我看来,y=++y不符合标准,但我认为最好确定一下(不确定我比那些在MS上编写这些测试的人更好)。所以我在征求你的意见。您认为这样的表达式符合标准,不会导致未定义的行为吗?

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(){
    int a = 10;
    int b = 10;
    a = ++a;    //What ???
    b = b++;    //What ???
    printf("%d %d
"
,a,b);
    return 0;
}

当使用-Wsequence-point编译时,gcc会抱怨它。(没有明确说明它是C或C++特定的问题。)

但只有四个答案:

1
2
3
4
a) 10 10
b) 11 10
c) 10 11
d) 11 11

虽然一个答案并不局限于只选择一个答案(所以也许我应该选择全部四个答案?)

在我看来,在自我递增和分配之间没有序列点。所以这违反了规范。不是吗?


它们都是按照C++ 11定义的行为。C++ 11甚至没有序列点,所以序列点相关警告显然是过时的。赋值运算符对其参数强制排序。

编辑:

虽然每个人都同意i = ++i现在是定义明确的行为,但决定i = i++的定义是相当重要的。直观地说,我应该把它描述得很清楚,但是标准明确指出

1
i = i++ + 1;

是乌兰巴托,我看不到埃多克斯一号〔2〕在这里有什么不同。

简而言之,如果你想回答这个问题,你需要成为一个专家,在决定性的不平凡的C++ 11排序规则,看起来我不是,但似乎答案是"以上没有因为UB"。


按照C++ 03标准,以下两个语句都会导致未定义的行为:

1
2
a = ++a;
b = b++;

正如您正确陈述的,G++指出以下警告:

warning: operation on ‘a’ may be undefined [-Wsequence-point]

注意,对于UB,答案可以是(a)、(b)、(c)、(d)以外的任何内容。理想情况下,测试问题中应该有一个"未定义行为"选项。但通常,准备问题的人只需在XYZ编译器中编译并提交问题。

这里有一篇相关的文章,解释了未定义的行为和序列点。


a= ++a;B= B++;这些操作被认为是未定义的。每个编译器都可以随心所欲地工作。输出因编译器而异,审查员提出了问题。


我认为它是d),因为+a意味着增量a,然后执行操作,所以它就像执行a=11一样。B++意味着做这个操作,然后递增,所以你会给B=10赋值,但是如果B=11,它就会递增。

对纯粹主义者来说,这不是"先说什么,然后说什么",而是行为。我测试了它(使用Visual C++和G++),我的答案是正确的A=11和B=11。