gpt4 book ai didi

c++ - 为什么通过引用同时传递给两个函数会导致它不更改引用值?

转载 作者:行者123 更新时间:2023-11-28 03:03:07 25 4
gpt4 key购买 nike

因此,我编写了将整数更改为 int 数组的简单函数(用于 long 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,这应该会改变它的长度。如果我将 main 划分为

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++);

关于c++ - 为什么通过引用同时传递给两个函数会导致它不更改引用值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com