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)
虽然一个人不仅限于选择一个答案(所以也许我应该选择全部四个?)
嗯,在我看来,在自我递增和分配之间没有序列点.所以这违反了规范.不是吗?
根据C++ 11,它们都是明确定义的行为.C++ 11甚至没有序列点,因此与序列点相关的警告显然已经过时了.赋值运算符对其参数进行排序.
编辑:
虽然每个人都可以同意i = ++i现在定义明确的行为,但决定其定义是非常重要的i = i++.直观地说,我应该将其描述为明确的,但标准明确指出
i = i++ + 1;
Run Code Online (Sandbox Code Playgroud)
是UB,我没有看到+ 1这里有任何不同.
简而言之,如果你想回答这个问题,你需要成为一个非常重要的C++ 11排序规则的专家,看起来我不是,但似乎答案是"没有以上是因为UB".