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

C语言中链调用的求值顺序

燕航
2023-03-14

假设我们有类< code>A:

class A {
public:
    A& func1( int ) { return *this; }
    A& func2( int ) { return *this; }
};

和 2 个标准功能:

int func3();
int func4();

现在在这个代码中:

A a;
a.func1( func3() ).func2( func4() );

函数 func3()func4() 的评估顺序是否定义?

根据该答案,未定义的行为和序列点其中一个序列点是:

  • 在函数调用中(无论函数是否内联),在执行函数体中的任何表达式或语句之前对所有函数参数(如果有)进行评估之后(§1.9/17)。

那么“评估所有函数参数”是否意味着必须在调用< code>func4()之前调用< code>func3(),因为必须在调用< code>func2()之前评估< code>func1()参数?

共有2个答案

訾安邦
2023-03-14

不可以,func3 和 func4 可以按任一顺序进行评估(但不能交错)。

边桐
2023-03-14

它的要点是在函数调用中,< code>X(Y,Z);所有< code>X 、< code>Y 、< code>Z的计算都是不确定的相互排序。唯一的排序是< code>Y和< code>Z在调用< code>X计算的函数之前排序。

假设我们有:

typedef void (*fptr)(int, double);
fptr a();
int b();
double c();

a()(b(), c());

这三个函数abc可以按任何顺序调用。当然,这一切都以递归方式应用于任何子表达式。

 类似资料:
  • 在 Go 语言开篇中我们已经知道,Go 语言与 C 语言之间有着千丝万缕的关系,甚至被称之为 21 世纪的C语言。 所以在 Go 与 C 语言互操作方面,Go 更是提供了强大的支持。尤其是在 Go 中使用 C,你甚至可以直接在 Go 源文件中编写 C 代码,这是其他语言所无法望其项背的。 格式: 在 import "C" 之前通过单行注释或者通过多行注释编写C语言代码 在 import "C" 之

  • 我将创建一个可以插入并显示到现在的链接: 这是我的初始化函数,只会为第一个

  • 在 Go 代码中通过 //export Go函数名称 导出Go的函数名称 在 C 代码中通过 extern 返回值类型 Go函数名称(形参列表); 声明 Go 中导出的函数名称 注意://export Go 函数名称 和 extern 返回值类型 Go函数名称(形参列表); 不能在同一个文件中 package main import "C" import "fmt" // 导出Go函数声

  • 本文向大家介绍windows中使用C# 调用 C语言生成的dll,包括了windows中使用C# 调用 C语言生成的dll的使用技巧和注意事项,需要的朋友参考一下 首先建立一个C语言源文件test.c 然后下载mingw64,解压,进入到bin目录,查看是否有gcc.exe ,只要下载正确肯定是有的,可以把这个bin目录加入环境变量,就可以在任意地方运行gcc。偷懒的做法是直接把刚才做好的test

  • 这段代码给出的答案不是很直观: 0 1 我明白为什么会发生这种情况-赋值的左侧返回对底层值的引用,同时创建上述值,然后才使用新计算的对右侧进行评估映射。 这种行为在C标准中是否有表述?还是求值顺序没有定义? 使用g 5.2.1获得结果。

  • 本文向大家介绍C#语言Parallel.Invoke 并行调用,包括了C#语言Parallel.Invoke 并行调用的使用技巧和注意事项,需要的朋友参考一下 示例 并行调用方法或动作(并行区域)