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

C++ 为什么同时通过引用传递给两个函数会导致它不改变引用值?,c++,parameters,parameter-passing,C++,Parameters,Parameter Passing,所以,我编写了一个简单的函数,将整数转换为int数组(用于长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]<<sep

所以,我编写了一个简单的函数,将整数转换为int数组(用于长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;
}
它给了我正确的结果。为什么呢?
(我使用的是Visual Studio 2010)

问题在于函数参数中求值变量的顺序。。VS中的默认调用约定是_cdecl-它按相反顺序(从右到左)在堆栈上推送参数。因此,在您的示例中,它将第一个l=0推送到printIntArray,并且仅在这之后调用toArray(这会更改l值)

请参阅以获取参考。

在函数调用(C样式-C/C++中的默认值)中,参数从右到左存储在堆栈上。一些编译器也将按该顺序进行计算

我不确定标准是否要求任何东西,但依靠参数评估的顺序不是一个好主意。这样的bug可能很难找到

我只能建议避免任何关于参数评估顺序的先验知识

顺便说一句,你的问题在面试中被问到:)

这里将打印什么

int i = 0;
printf("%d %d", ++i. i++);

函数调用中的顺序不明确,并且依赖于某个顺序,代码调用未定义的行为。对于C++,代码中没有实际引用,只是指针。@ H2CO3好奇。尽管如此,为什么它在debiggin时以“正确”的顺序计算函数?(奇怪的是,在离开函数后没有保留零钱)@JoachimPileborg我现在感觉像是勺子场景中的尼奥。。。没有引用。@Xyzk IDK。这是一个实现细节(首先,UB是UB,无法解释)
int i = 0;
printf("%d %d", ++i. i++);