C++ 为什么编译器使用C++;先执行命令后执行命令?

C++ 为什么编译器使用C++;先执行命令后执行命令?,c++,compilation,C++,Compilation,有人能解释一下为什么我写这段代码吗 int x = 6; cout << x << endl << ++x << endl; intx=6; 在C++表达式中,子表达式的评价顺序不由标准指定,而是作为实现定义来保留。因此,在您的表述中,您对x零件在++x零件之前进行评估的期望是没有根据的:本标准没有做出此类要求。在您的例子中,首先评估了 ++x//COD>子表达式,导致7作为参数值传递给C++表达式中的运算符> P>,子表达式的评

有人能解释一下为什么我写这段代码吗

    int x = 6;
    cout << x << endl << ++x << endl;
intx=6;

在C++表达式中,子表达式的评价顺序不由标准指定,而是作为实现定义来保留。因此,在您的表述中,您对
x
零件在
++x
零件之前进行评估的期望是没有根据的:本标准没有做出此类要求。在您的例子中,首先评估了<代码> ++x//COD>子表达式,导致7作为参数值传递给C++表达式中的运算符> P>,子表达式的评价顺序没有被标准指定,而是作为实现定义。因此,在您的表述中,您对
x
零件在
++x
零件之前进行评估的期望是没有根据的:本标准没有做出此类要求。在本例中,首先计算
++x
子表达式,结果是在
运算符的两种情况下,7都作为参数值传递
而且,与任何其他函数调用一样,其参数的求值顺序没有定义。也就是说,编译器可以发出

int a = f(c, x);
int b = ++x;
f(a, b);

int b = ++x;
int a = f(c, x);
f(a, b);
有充分的理由不指定这个评估顺序(不是未定义的):不同的平台有不同的调用约定,这给了优化者更多的操作空间

尽管如此,如果您关心它们的求值顺序,您必须将其明确化

而且,与任何其他函数调用一样,其参数的求值顺序没有定义。也就是说,编译器可以发出

int a = f(c, x);
int b = ++x;
f(a, b);

int b = ++x;
int a = f(c, x);
f(a, b);
有充分的理由不指定这个评估顺序(不是未定义的):不同的平台有不同的调用约定,这给了优化者更多的操作空间



尽管如此,如果你关心评估的顺序,你必须将其明确化。

我的感觉是,偶尔,这些类型的问题值得回答。这是一个更微妙的变体,++i+i++类东西。因为DUPE没有C++标签,你可能也对阅读感兴趣,我不喜欢那个DUPE,因为这一个有过载操作符。它讨论了未定义的行为示例,但在这个问题中没有未定义的行为-只有实现定义的求值顺序。如果它是
x,这不是问题所在,但是不要使用
std::endl
,除非你需要额外的东西<代码>'\n'
结束一行。我的感觉是,偶尔,这些类型的问题值得回答。这是一个更微妙的变体,++i+i++类东西。因为DUPE没有C++标签,你可能也对阅读感兴趣,我不喜欢那个DUPE,因为这一个有过载操作符。它讨论了未定义的行为示例,但在这个问题中没有未定义的行为-只有实现定义的求值顺序。如果它是
x,这不是问题所在,但是不要使用
std::endl
,除非你需要额外的东西<代码> \n′/COD>结束一条线。C++变成一种非常棒的语言——没有人知道什么是正确的,什么是不正确的。我一次又一次地看到一些问题,在这些问题中,知识渊博的人给出了相互矛盾的答案。如果你需要成为一名语言律师,只是为了了解表达是否有效,那么语言就有不好的问题。恐怕语言作家越来越脱离现实(但你不需要成为一名语言律师,知道这个例子看起来很可疑。它需要一些经验,但是你不需要回忆细节,知道它闻起来很糟糕。C++变成了一种非常棒的语言——没有人知道什么是正确的,什么是不正确的。我一次又一次地看到一些问题,在这些问题中,知识渊博的人给出了相互矛盾的答案。如果你需要成为一名语言律师,只是为了意识到表达是否有效,那么语言就有不好的问题。恐怕语言作者越来越脱离现实(但是你不需要成为语言律师就知道这个例子看起来很可疑。这需要一些经验,但你不需要回忆细节就知道它闻起来很难闻。赞成票。我认为这个答案是正确的,不像我删除的我的答案。干杯!出错的细节和原因可能很棘手,但幸运的是它们是正确的。)不需要看到原始代码很糟糕。@Uffeed AFAIK,
我想这就是我所说的,不是吗?投票结果是正确的。我认为这个答案是正确的,不像我已经删除的我的答案。干杯!错误的细节和原因可能很棘手,但幸运的是他们不需要看到原始代码很糟糕。@Useles很好,
我想我是不是也这么说了?
int a = f(c, x);
int b = ++x;
f(a, b);
int b = ++x;
int a = f(c, x);
f(a, b);