C++ 产生这种输出的原因是什么?

C++ 产生这种输出的原因是什么?,c++,C++,我有以下代码 int x=80; int &y=x; x++; cout<<x<<" "<<--y; intx=80; int&y=x; x++; cout表达式的计算公式为: ((cout << x) << " ") << --y; ((cout这是未定义的行为,C/C++标准不定义将参数推入堆栈的方式,通常按相反顺序推入参数,例如: func(1, 2) 将被评估为类似于:

我有以下代码

    int x=80;
    int &y=x;
    x++;
    cout<<x<<" "<<--y;
intx=80;
int&y=x;
x++;

cout表达式的计算公式为:

((cout << x) << " ") << --y;

((cout这是未定义的行为,C/C++标准不定义将参数推入堆栈的方式,通常按相反顺序推入参数,例如:

func(1, 2)
将被评估为类似于:

push 2
push 1
call func
因此,在您的例子中,
--y
x
之前被计算和推送。在本例中很清楚:

#include <iostream>

int a() { std::cout << "a" << std::endl ; return 1; }
int b() { std::cout << "b" << std::endl ; return 2; }

int main(void) {

    std::cout << a() << " " << b() << std::endl;

    return 0;
}
但它显示:

b
a
1 2
递增x并生成x的原始值作为表达式结果


特别是,对于x++来说,对于x的增量和原始值的产生没有隐含时间顺序。编译器可以自由地发出产生x原始值的机器代码,例如,它可能存在于某个寄存器中,并且延迟增量直到表达式结束(下一个序列点)。虽然
x++
似乎将x增加到81,但直到打印完成后才开始执行。根据
--y
,它将获得增加的值(81)在打印前将其缩小为<>强>前缀>运算符。

< P> >重定向运算符<代码>的一个讨厌的问题。这个问题应该有助于澄清:C++中指针变量和引用变量之间有什么区别?。您缺少一个序列点。请检查已编辑的代码。这肯定与指针算法有关。当我们说y有一个地址x,即80,并尝试递减y时,它在我的系统上也不会递减。@SanyamGoel:这是未定义的行为。不同的编译器可以(也将)递减输出不同的东西。LHS和RHS的评价顺序是实现定义,加上读和写到 X<代码>,没有序列点=未定义的行为(即它不合适的C++,它可以做任何事情)。建议编辑:“参见详细解释。”@SanyamGoel:这一切都与序列点有关,而与指针运算无关。检查[和[@jrok:确实如此。如果这个该死的接近的东西起作用的话,我实际上会投票以dup(Alok指出了一个伟大的匹配)的形式关闭。。。
b
a
1 2
x++
std::cout << f() << g() << std::endl;
std::cout << f(g()) << h(i()) << std::endl;