函数参数评价顺序

函数参数评价顺序

在……里面C/C++,函数的参数求值是否有固定的顺序?我是说,标准是怎么说的?是吗left-to-rightright-to-left?我从书上得到了令人困惑的信息。

是否有必要function call应该使用stack only..是什么C/C++标准怎么说?


繁星coding
浏览 396回答 3
3回答

拉莫斯之舞

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

九州编程

在C/C+中,函数的参数求值有固定的顺序。我的意思是标准是从左到右还是从右到左。我从书上得到了令人困惑的信息。不,函数参数(以及任何表达式中的两个子表达式)的求值顺序是未指明的行为在C和C+中。在简单的英语中,这意味着最左边的参数可以先求值,也可以是最右边的参数,并且您无法知道适用于特定编译器的顺序。.例子:static&nbsp;int&nbsp;x&nbsp;=&nbsp;0;int*&nbsp;func&nbsp;(int&nbsp;val){ &nbsp;&nbsp;x&nbsp;=&nbsp;val; &nbsp;&nbsp;return&nbsp;&x;}void&nbsp;print&nbsp;(int&nbsp;val1,&nbsp;int&nbsp;val2){ &nbsp;&nbsp;cout&nbsp;<<&nbsp;val1&nbsp;<<&nbsp;"&nbsp;"&nbsp;<<&nbsp;val2&nbsp;<<&nbsp;endl;}print(*func(1),&nbsp;*func(2));这个代码很糟糕。它依赖于打印参数的评价顺序。它将打印“1 1”(从右到左)或“2 2”(从左到右)和我们不知道是哪一个..标准唯一保证的是,对func()的两个调用都是在调用print()之前完成的。解决这一问题的方法是注意顺序是未指定的,并编写不依赖于计算顺序的程序。例如:int&nbsp;val1&nbsp;=&nbsp;*func(1);int&nbsp;val2&nbsp;=&nbsp;*func(2);print(val1,&nbsp;val2);&nbsp;//&nbsp;Will&nbsp;always&nbsp;print&nbsp;"1&nbsp;2"&nbsp;on&nbsp;any&nbsp;compiler.是否有必要只使用堆栈实现函数调用。C/C+标准对此有何说明。这就是所谓的“调用约定”,而不是标准所指定的任何内容。如何传递参数(和返回值)完全取决于实现。它们可以在CPU寄存器或堆栈中传递,也可以其他方式传递。调用者可能负责推/弹出堆栈上的参数,也可以由函数负责。函数参数的求值顺序只与调用约定有一定的关联,因为计算是发生的。以前函数被调用。但另一方面,某些编译器可以选择将最正确的参数放在CPU寄存器中,其余参数放在堆栈中,举个例子。
打开App,查看更多内容
随时随地看视频慕课网APP