当前位置: 首页 > 知识库问答 >
问题:

函数参数不是从左到右计算的吗?同一个变量的副作用是如何排序的?

丁俊智
2023-03-14

考虑以下程序。

#include<iostream> 
using namespace std; 

void fn(int a, int b)
{
    cout << a;
    cout << b;
}

int main()
{
    int a = 10;
    fn(a++, --a);
    fn(a--, ++a);
    return 0;
}

我不明白我得到的输出(gcc 11.2):

9101110

不应该先计算< code>a 吗?那么< code>fn怎么能得到9呢?这是未定义的行为还是简单的“不确定”?C 17在这方面有变化吗?

共有1个答案

松铭
2023-03-14

这是未定义的行为。参数评估的顺序未指定。

请参阅此处。

所以这个问题是无关的,像这样的代码永远不应该被使用。

一个编译器上的输出可能是9 10 11 10,而另一个编译器的输出可能会是完全不同的值(而这两个编译器仍然是标准投诉)。

 类似资料:
  • 所以从左到右和从右到左在这里都不起作用,似乎是同时进行的。我的翻译版本是3.8 请帮帮我。谢了!

  • 但似乎静态变量背后的过程是不同的!那么,这个静态变量背后到底发生了什么,它是如何工作的呢?

  • 我正在尝试制作计算器,但我对JTextField有一个问题。当我点击数字(JButtons),比如1,2,3,4,5,它们就会出现在JTextField上,比如54321。那么,我怎样才能把它改成12345而不是54321呢?

  • 问题内容: 我了解协方差和逆方差。但是有一件小事我无法理解。在Coursera的“ Scala中的函数式编程”课程中,Martin Ordersky提到: 函数的参数类型是互变的,而返回类型是协变的 因此,例如在Java中,让extends出现。并让一个函数为: 我有函数调用为 所以基本上就是这样。根据Wiki,协方差是“从宽到窄转换”。在上面,我们正在从狗变成动物。所以论点类型不是协变而是协变吗

  • 前提: 在玩了一点可变模板之后,我意识到实现稍微超出琐碎的元编程任务的任何东西很快就会变得相当麻烦。特别是,我发现自己希望有一种方法可以在参数包上执行泛型操作,比如迭代、拆分、在-类似的方式中循环等等。 在观看了Andrei Alexandresu从C和超越2012关于进入C(借用自D编程语言的构造)的可取性的讲座后,我有一种感觉,某种将会出现也很方便——我觉得更多的这些结构可以带来好处。 所以我

  • 问题内容: 说我有 我明白 会导致 [(’Able’,10),(’Dog’,15),(’Baker’,20),(’Charlie’,20)]] 但这如何工作? 问题答案: 传递给您的函数将获得要排序的每个项目,并返回Python可以排序的“键”。因此,如果要按字符串的 相反顺序 对字符串列表进行排序,可以执行以下操作: 这使您可以指定每个项目的排序依据值,而不必更改项目。这样,您不必构建反向字符串