`y = ++ y`,这个标准是否合规?[出现在微软的测试中]

pho*_*gon 12 c c++ undefined-behavior language-lawyer

我知道这看起来很熟悉但是在微软招募实习生的测试中,这是一个问题.在我看来,这y=++y不符合标准,但我认为可能更好(确定我比那些在MS上编写这些测试的人更好).所以我问你的建议.您认为这样的表达式是否符合标准并且不会导致未定义的行为

#include <stdio.h>
int main(){
    int a = 10;
    int b = 10;
    a = ++a;    //What ???
    b = b++;    //What ???
    printf("%d %d\n",a,b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc用来编译时抱怨它-Wsequence-point.(没有明确说明它是否是C或C++特定问题.)

但只提供了四个答案:

a) 10 10
b) 11 10
c) 10 11
d) 11 11
Run Code Online (Sandbox Code Playgroud)

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

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

Pup*_*ppy 9

根据C++ 11,它们都是明确定义的行为.C++ 11甚至没有序列点,因此与序列点相关的警告显然已经过时了.赋值运算符对其参数进行排序.

编辑:

虽然每个人都可以同意i = ++i现在定义明确的行为,但决定其定义是非常重要的i = i++.直观地说,我应该将其描述为明确的,但标准明确指出

i = i++ + 1;
Run Code Online (Sandbox Code Playgroud)

是UB,我没有看到+ 1这里有任何不同.

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

  • @DeadMG好的,我以论文的形式提出[论点](http://i.imgur.com/Ep3mcBu.jpg)!箭头表示"之前排序"."VC"代表值计算.这是未定义行为的原因是因为图中的两个已加星标的节点未被排序.其主要原因来自标准的修复后增量部分:"在修改操作数对象之前,对++表达式的值计算进行了排序." (3认同)