C++ std::cout在c++; #包括 INTA(int&x){ x=-1; 返回x; } int main(){ int x=5; std::cout

C++ std::cout在c++; #包括 INTA(int&x){ x=-1; 返回x; } int main(){ int x=5; std::cout,c++,expression,std,operator-precedence,expression-evaluation,C++,Expression,Std,Operator Precedence,Expression Evaluation,在这行中: #include <iostream> int a(int &x) { x = -1; return x; } int main () { int x = 5; std::cout << a(x) << " " << x << std::endl; } std::cout计算a(x)和x的顺序是未指定的[1]。要确保x不会在同一表达式中被修改(并通过这样做避免未指定的行为),可以

在这行中:

#include <iostream>

int a(int &x) {
    x = -1;
    return x;
}

int main () {
    int x = 5;
    std::cout << a(x) << " " << x << std::endl;
}

std::cout计算
a(x)
x
的顺序是未指定的[1]。要确保
x
不会在同一表达式中被修改(并通过这样做避免未指定的行为),可以执行以下操作:

std::cout << a(x) << " " << x << std::endl;
intx=5;
int y=a(x);

std::cout评估的顺序是不顺序的,因此可以先评估
a(x)
x
。关于
1.9节
程序执行,第15段说(重点):

[…]除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的求值是不排序的。[注:在程序执行期间多次求值的表达式中,其子表达式的未排序和不确定排序求值不需要在不同求值中一致执行。-结束注][…]

不同的评估结果甚至可能有所不同,如果我们回到第13段,它会说:

[…]如果A未在B之前排序,B未在A之前排序,则A和B未排序[注:未排序评估的执行可能重叠。-结束注]当A在B之前排序或B在A之前排序时,A和B的排序不确定,但未指定哪个[…]


这解释了这是未指定的行为。

这是未定义的行为?我认为这是未指定的行为。@Nawaz Hm,可能是未指定的行为(§1.3.15)我想。编辑。这在我看来很奇怪,因为函数已经工作了。我希望内存中单元格中的值已经更改。也许有人能解释一下如何在asm代码中翻译它?@SukhanovNiСkolay它已经更改了,如果你在这一行后面看的话。编译器将这一行变成了
auto tmp1=x;auto tmp2=a(x);std::我认为它是未指定的,不是未定义的。这些的标准术语是功能副作用
int x = 5;
int y = a(x);
std::cout << y << " " << x << std::endl;