为什么同时传递对两个函数的引用会导致它不更改引用值
Why does passing by reference to two functions at once cause it to not change reference value?
因此,我编写了一个简单的函数,将整数更改为int数组(用于长整型计算,现在我想我本可以使用std::stoi…),但它不会返回我预期的结果。
int main(){
int l=0;
printIntArray(toArray(12345,l),l);
return 0;
}
void printIntArray(int* a, int n, char separator){
for(int i=0;i<n;i++)
std::cout<<a[i]<<separator;
std::cout<<std::endl;
}
void printIntArray(int* a, int n){
for(int i=0;i<n;i++)
std::cout<<a[i];
std::cout<<std::endl;
}
int power(int a, int p){
for(int i=0;i<p;i++)
a*=a;
return a;
}
int* toArray(int a, int& l){
l=1;
int p=10;
//find how many digits are there
for(;p<=a;p*=10){
l++;
}
p/=10;
int* result = new int[l];
for(int i=0;i<l;i++){
result[i]=a/p;
a-=result[i]*p;
p/=10;
}
return result;
}
问题是,当我调试printIntArray时,l的值是0。但是,在调用print之前,将调用toArray,这将更改它的长度。如果我将主干划分为
int main(){
int l=0;
int* t=toArray(12345,l);
printIntArray(t,l);
return 0;
}
它给了我正确的结果。为什么?(我使用的是Visual Studio 2010)
在__cdecl函数调用(C风格-C/C++中的默认值)中,参数从右到左存储在堆栈中。一些编译器也会按此顺序进行计算。
我不确定这个标准是否要求什么,但依赖参数评估的顺序不是一个好主意。这样的虫子很难找到。
我只能建议避免任何关于参数评估顺序的先验知识。
顺便说一句,你的问题是在面试中问的:)
这里将打印什么?
int i = 0;
printf("%d %d", ++i. i++);
问题在于函数参数中求值变量的顺序。。VS中的默认调用约定是__cdecl——它按相反的顺序(从右到左)在堆栈上推送参数。因此,在您的示例中,它将第一个l=0推送到printIntArray,然后才调用toArray(更改l值)。
请参阅http://msdn.microsoft.com/en-us/library/vstudio/984x0h58%28v=vs.100%29.aspx以供参考。
相关文章:
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 无法将右值引用函数与 GCC 匹配
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 通过引用函数传递指针参数是什么意思?
- 常量引用函数参数的地址何时唯一?
- 我想了解为什么在这个例子中使用引用函数?或者引用在c++函数中的重要性
- C++ 通过引用函数传递数组,但内容保持不变
- 用数组或指针引用函数?
- 引用函数如何"int &foo();"工作?
- 常量引用函数参数:是否可以禁止临时对象?
- 计算在代码中引用函数的次数
- <initializer_list> 引用函数
- 字符串引用(函数)的差异
- 在类中引用函数时的"No Matching Function for Call"
- 无法通过引用函数"calcValues"中"firstNum"和"secondNum"变量来更改值
- 尝试引用已删除的函数(不引用函数)
- 引用函数指针
- 引用函数按值和自动返回
- 为什么我们可以取消引用函数指针
- 通过引用函数传递值的目的是什么