为了账号安全,请及时绑定邮箱和手机立即绑定

函数参数评价顺序

函数参数评价顺序

C++ C
繁星coding 2019-07-09 15:27:15
函数参数评价顺序在……里面C/C++,函数的参数求值是否有固定的顺序?我是说,标准是怎么说的?是吗left-to-right或right-to-left?我从书上得到了令人困惑的信息。是否有必要function call应该使用stack only..是什么C/C++标准怎么说?
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

保持它的安全:标准让编译器来决定参数的计算顺序。所以你不应该依赖特定的命令。


查看完整回答
反对 回复 2019-07-09
?
九州编程

TA贡献1785条经验 获得超4个赞

在C/C+中,函数的参数求值有固定的顺序。我的意思是标准是从左到右还是从右到左。我从书上得到了令人困惑的信息。

不,函数参数(以及任何表达式中的两个子表达式)的求值顺序是未指明的行为在C和C+中。在简单的英语中,这意味着最左边的参数可以先求值,也可以是最右边的参数,并且您无法知道适用于特定编译器的顺序。.

例子:

static int x = 0;int* func (int val){
  x = val;
  return &x;}void print (int val1, int val2){
  cout << val1 << " " << val2 << endl;}print(*func(1), *func(2));

这个代码很糟糕。它依赖于打印参数的评价顺序。它将打印“1 1”(从右到左)或“2 2”(从左到右)和我们不知道是哪一个..标准唯一保证的是,对func()的两个调用都是在调用print()之前完成的。

解决这一问题的方法是注意顺序是未指定的,并编写不依赖于计算顺序的程序。例如:

int val1 = *func(1);int val2 = *func(2);print(val1, val2); // Will always print "1 2" on any compiler.

是否有必要只使用堆栈实现函数调用。C/C+标准对此有何说明。

这就是所谓的“调用约定”,而不是标准所指定的任何内容。如何传递参数(和返回值)完全取决于实现。它们可以在CPU寄存器或堆栈中传递,也可以其他方式传递。调用者可能负责推/弹出堆栈上的参数,也可以由函数负责。

函数参数的求值顺序只与调用约定有一定的关联,因为计算是发生的。以前函数被调用。但另一方面,某些编译器可以选择将最正确的参数放在CPU寄存器中,其余参数放在堆栈中,举个例子。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 395 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信