所有
当我们将表达式作为参数传递时,评估是如何进行的?这是一个小例子。这只是伪代码类:
f (x,y)
{
y = y+1;
x = x+y;
}
main()
{
a = 2; b = 2;
f(a+b, a)
print a;
}
访问x
中的变量f
时,是否访问包含a+b
结果的临时变量的地址,或者是否会访问a
的各个地址和b
,然后评估a+b
请帮忙。
此致 darkie15
答案 0 :(得分:1)
有些语言依赖,但在C ++中
f(a+b, a)
计算a + b并将评估结果推送到堆栈,然后将对此值的引用传递给f()。这只有在f()的第一个参数是s const引用时才有效,因为像a + b的结果这样的临时对象只能绑定到const引用。
答案 1 :(得分:1)
在C或C ++中,只要x和y不是指针(在这种情况下表达式无论如何都是有用的),它们都会在函数调用之前进行求值,并且结果的VALUE被压入堆栈。根本没有参考。
C和C ++中的所有参数始终按值传递。如果将引用类型(例如int *,int&)传递给函数,则传递引用的VALUE。虽然可以通过访问函数中的* x来更改引用的对象,但仍无法更改引用的值,因为C和C ++参数始终始终仅按值传递。
编辑:C和C ++中的一个例外情况是,某些重载运算符的定义如下:
T* operator+ (L lhs, R rhs) {return new T(lhs, rhs);}
且x是L,y是R.在这种情况下,函数生成的T *的值作为参数被压入堆栈。不要写那样的代码,它会让其他程序员感到困惑= D。