首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数参数求值顺序

函数参数求值顺序
EN

Stack Overflow用户
提问于 2012-03-05 19:54:30
回答 4查看 8.9K关注 0票数 22

在C和C++中,函数的参数求值有固定的顺序吗?我是说,标准是怎么说的?是left-to-right还是right-to-left?我从书中得到了令人困惑的信息。

是否有必要使用stack only实现function call?C和C++标准对此有什么规定?

EN

回答 4

Stack Overflow用户

发布于 2012-03-05 19:56:23

保证参数的安全:该标准将其留给编译器来确定参数的计算顺序。因此,您不应该依赖于保持特定的顺序。

票数 9
EN

Stack Overflow用户

发布于 2012-03-05 20:33:48

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

不,函数参数(以及任何表达式中的两个子表达式)的求值顺序在C和C++中是未指定的行为。简单地说,这意味着可以首先计算最左边的参数,或者它可能是最右边的参数,并且您不知道适用于特定编译器的顺序。

示例:

代码语言:javascript
复制
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()之前完成。

这个问题的解决方案是意识到顺序是未指定的,并编写不依赖于求值顺序的程序。例如:

代码语言:javascript
复制
int val1 = *func(1);
int val2 = *func(2);
print(val1, val2); // Will always print "1 2" on any compiler.

是否有必要仅使用堆栈实现函数调用。C/C++标准对此做了什么说明。

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

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

票数 3
EN

Stack Overflow用户

发布于 2016-04-22 23:59:53

仅就C语言而言,函数参数内部的求值顺序取决于编译器。来自,的C编程语言,Brian KernighanDennis Ritchie

类似地,未指定计算函数参数的顺序,因此语句

printf("%d %d\n", ++n, power(2, n)); /*WRONG */

使用不同的编译器可以产生不同的结果,这取决于在调用power之前n是否递增。当然,解决方案是编写

++n;

printf("%d %d\n", n, power(2, n));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9566187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档