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

C方法链中的执行顺序

单于轶
2023-03-14

该程序的输出:

#include <iostream> 
class c1
{   
  public:
    c1& meth1(int* ar) {
      std::cout << "method 1" << std::endl;
      *ar = 1;
      return *this;
    }
    void meth2(int ar)
    {
      std::cout << "method 2:"<< ar << std::endl;
    }
};

int main()
{
  c1 c;
  int nu = 0;
  c.meth1(&nu).meth2(nu);
}

是:

method 1
method 2:0

为什么当 meth2() 开始时 nu 不是 1?

共有3个答案

鲜于温书
2023-03-14

在1998 C标准第5节第4段中

除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的求值顺序以及副作用发生的顺序都是未指定的。在前一个序列点和下一个序列点之间,标量对象的存储值最多只能通过表达式的计算修改一次。此外,应仅访问先前值来确定要存储的值。对于完整表达式的每个允许的子表达式排序,应满足本段的要求;否则行为是未定义的。

(我省略了对脚注#53的引用,这与这个问题无关)。

本质上,

后来的C标准(我目前在今晚使用的PC上没有)基本上具有相同的子句。

田鸿彩
2023-03-14

我认为标准草案中关于评估顺序的这一部分是相关的:

1.9程序执行

...

此外:

5.2.2函数调用

...

所以对于你的行c.meth1(

operator()(c.meth1(&nu).meth2, nu);

最后函数调用的后缀表达式和参数的求值(即后缀表达式<code>c.meth1(

换言之,编译器不需要在meth1调用之后对nu参数进行求值-可以自由假设meth1的任何副作用都不会影响nu求值。

上述生成的汇编代码在主功能中包含以下序列:

  1. 变量 nu 在堆栈上分配,并以 0 进行初始化。
  2. 寄存器(在我的情况下是ebx)收到nu值的副本
  3. nuc 的地址加载到参数寄存器中
  4. 甲基苯丙胺1被称为
  5. 返回值寄存器和 ebx 寄存器中先前缓存的 nu 值将加载到参数寄存器中
  6. 甲基苯丙胺2被称为

至关重要的是,在上面的第5步中,编译器允许在对ome2的函数调用中重新使用第2步中的nu的缓存值。在这里,它忽略了nu可能已被调用ome1-'未定义行为'在起作用。

注:本答复实质上已从原来的形式改变。我最初对操作数计算的副作用的解释在最终函数调用之前没有进行排序是不正确的,因为它们确实如此。问题在于操作数本身的计算是不确定的排序。

洪通
2023-03-14

因为评估顺序未指定。

你看到 main 中的 numeth1 被调用之前就被评估为 0。这就是链接的问题。我建议不要这样做。

只需制作一个漂亮、简单、清晰、易读、易懂的程序:

int main()
{
  c1 c;
  int nu = 0;
  c.meth1(&nu);
  c.meth2(nu);
}
 类似资料:
  • 我正在尝试使用testng.xml执行testcases。我已经将所有的测试运行类放在一个测试中。在执行时,我注意到第二类(仪表板类)的@beforeTest方法首先执行。我希望执行所有类的@beforeTest方法,以与testng.xml文件中的类相同的执行顺序执行。请看下面的图片。 对于我在提到的类中使用的所有@beforeTest和@beforeClass我都使用了waysrun=true

  • 本文向大家介绍如何在Cucumber中设置测试方法的执行顺序?,包括了如何在Cucumber中设置测试方法的执行顺序?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过order关键字来设置Cucumber中测试方法的执行顺序。在步骤定义文件中按顺序分配了测试方法。 顺序较低的测试方法首先执行,然后顺序较高的测试方法。 示例 步骤定义文件。 具有较低顺序的测试方法(login()设置为1)将首

  • 问题内容: 遵循方法有效: 4个问题: 1)如果例如不好,我不想执行其余的功能,那我该如何退出(退出,中断,什么,..)? 2)我如何设置其中一些并行,其中一些串行? 3)如何在它们之间传输数据? 4)如何使以下函数从其先前结果中得到依赖? 问题答案: 您在问如何在promise中 链接 功能。 3)如何在它们之间传输数据? 4)如何使以下功能取决于其先前的结果? 返回 链中 下一个函数的数据(或

  • 本文向大家介绍C#异步执行任务的方法,包括了C#异步执行任务的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#异步执行任务的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍C++实现顺序表的方法,包括了C++实现顺序表的方法的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家上关键代码了。 以上所述是小编给大家介绍的顺序表的C++实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

  • 问题内容: 我有类似的代码 它没有在node.js中按顺序执行,因此在执行结束时得到一个空数组。问题是它将先执行然后执行 我的代码中是否有任何错误或执行此操作的任何其他方式?谢谢! 问题答案: 您可能已经知道,事情在node.js中异步运行。因此,当您需要使事物按特定顺序运行时,您需要利用控件库或基本上自己实现。 我强烈建议您看一下async,因为它可以轻松地使您执行以下操作: 在这里看到的主要内