我知道这看起来很熟悉,但它是微软在招聘实习生的测试中遇到的一个问题。在我看来, 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;
}
gcc
在使用 -Wsequence-point
编译时会报错。 (没有明确说明是 C 还是 C++ 特定的问题。)
但只提供了四个答案:
a) 10 10
b) 11 10
c) 10 11
d) 11 11
虽然一个不限于只选择一个答案(所以也许我应该选择所有四个?)
嗯,在我看来,自增和赋值之间没有序列点。所以这违反了规范。不是吗?
最佳答案
它们都是根据 C++11 定义良好的行为。 C++11 甚至没有 序列点,因此与序列点相关的警告显然已经过时。赋值运算符对其参数进行排序。
编辑:
虽然每个人都同意 i =++i
现在是明确定义的行为,但确定 i = i++
的定义性并非易事。直观地说,我应该将其描述为定义明确的,但标准明确指出
i = i++ + 1;
是 UB,我没有看到 + 1
在这里有什么不同。
简而言之,如果您想回答这个问题,您需要成为绝对不平凡的 C++11 排序规则方面的专家,我似乎不是,但答案似乎是“以上都不是因为 UB”。
关于c++ - `y=++y`,这个标准符合吗? [出现在微软的测试中],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15876734/