c++ - `y=++y`,这个标准符合吗? [出现在微软的测试中]

标签 c++ c language-lawyer undefined-behavior

我知道这看起来很熟悉,但它是微软在招聘实习生的测试中遇到的一个问题。在我看来, 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/

相关文章:

c++ - Spy++ 显示错误结果?

c - 初始化结构指针

c++ - 向下转换为 CRTP 基类构造函数中的派生类 : UB or not?

c++ - ReadWrite lock using Boost.Threads(如何转换这个简单的类)

c++ - 使用 l+(r-l)/2 避免溢出

c++ - 通过 C++ 驱动程序从 MongoDB 集合中批量删除

c++ - 传递给 std::for_each 的函数是否允许复制序列元素?

c++ - 使用超时终止函数

c - 了解头 tar 的变量 char size[]

c - printf 一个文字数字 (int),同时期望一个更短的数字