这个输出的原因是什么?

Emp*_*uin 14 c++

我有以下代码.

    int x=80;
    int &y=x;
    x++;
    cout<<x<<" "<<--y;
Run Code Online (Sandbox Code Playgroud)

输出结果是80 80.我不明白怎么做.我认为x的输出是81,尽管我对y一无所知.参数变量如何受减量运算符的影响.有人可以解释一下吗?

Mat*_*Mat 19

表达式评估为:

((cout << x) << " ") << --y;
Run Code Online (Sandbox Code Playgroud)

在表达式的左侧和右侧的评估之间没有序列点(或排序),编译器可以输出--y作为第一步评估的代码.

由于y是对此的引用x,这实际上是未定义的行为,因为您x在同一表达式中读取和写入而没有插入序列点.

  • @SanyamGoel:这是未定义的行为.不同的编译器可以(并将会)输出不同的东西.LHS和RHS的评估顺序是实现定义的,加上对"x"的读取和写入,没有序列点=>未定义的行为(即它不是正确的C++,它可以做任何事情). (4认同)

650*_*502 6

关于重定向运算符的一个令人讨厌的事情<<是它们直观地传达了一个确实不存在的"顺序计算"的缺陷.

当你写作

std::cout << f() << g() << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出将首先显示的结果f(),然后的结果g(),但实际调用g()可以调用之前发生f().

它甚至比这更糟糕......并不是序列不可预测,但确实序列的概念无效.在

std::cout << f(g()) << h(i()) << std::endl;
Run Code Online (Sandbox Code Playgroud)

例如合法的是被调用的第一个函数是g(),后跟i(),后跟h(),最后是f().甚至不能保证所有调用的顺序都相同(不是因为编译器制造商喜欢取笑你,而是因为代码可以内联,如果包含函数在不同的上下文中内联,编译器可能会决定不同的顺序).

保证评估顺序中序列的唯一C++运算符是:

  1. &&:首先评估左侧,并且仅当结果为"true"时评估右侧
  2. ||:首先评估左侧,并且仅当结果为"false"时评估右侧
  3. ?::首先评估条件,然后仅评估第二个或第三个操作数
  4. ,:逗号运算符...计算左侧,删除值,然后计算并返回右侧.注意:函数参数之间的逗号不是逗号运算符,也不强制执行评估顺序.

此外,此保护仅对预定义的运算符有效.如果您超载&&,||或者,在您的班级中,他们只是普通的操作员,对评估订单没有任何特殊限制.

任何其他运营商都不对评估订单施加任何限制,这包括<<即使使用类型欺骗您认为.