今天在看到C++程序设计(第四版)第89页的时候,书上这么说:
例如,若变量i的值为3,有以下函数调用
func(i,++i)
如果按从左到右顺序求实参的值,则相当于func(3,4) ps: 这句话没有什么问题
若按自右向左顺序求实参的值,则相当于func(3,3)
我按照教材上的思路走了一遍,因为i=3,所以++i 相当于将4的值传入,此时 i=4,然后再将4传入第一个参数的位置。最后的结果为func(4,4)。
“许多C++系统都是自右至左的顺序求值的” 所以,为了验证我的想法,我决定使用dev-C++ 进行实际操作。
#include <iostream>
using namespace std;
void func(int a,int b)
{
cout<<"a = "<<a<<"\t&a = "<<&a<<endl;
cout<<"b = "<<b<<"\t&b = "<<&b<<endl;
}
int main()
{
int i=3;
func(i,++i);
return 0;
}
运行结果和我所设想的一样 a 和 b 的值都为4,但是比较奇怪的是 a 和 b 之间多了四个字节的空档
访问该地址处的数据会得到一个-1的结果
事情到这里并没有完,我又尝试了其他几种情况,以func(++i,i)为例
#include <iostream>
using namespace std;
void func(int a,int b)
{
cout<<"a = "<<a<<"\t&a = "<<&a<<endl;
cout<<"b = "<<b<<"\t&b = "<<&b<<endl;
}
int main()
{
int i=3;
func(++i,i);
return 0;
}
最后运行结果
这个结果多少出乎我的意料,按照之前的计算方法,最后结果应为func(4,3)才对
我又进行了几次尝试,发现参数的传入貌似并不是一个一个传入,传入之后就不再相互影响
以func(++i , i)为例,第二个参数位置一开始为3,但是到了第一个参数位置++i 的操作导致i的值变为4,此时第二个参数也会受到影响而变为4。最后出现func(4,4)的结果。
然后。。我又进行了新的尝试,我将 i 定义在全局区,出现了像我一开始想的那样的运行结果
#include <iostream>
using namespace std;
int i = 3;
void func(int a,int b)
{
cout<<"a = "<<a<<"\t&a = "<<&a<<endl;
cout<<"b = "<<b<<"\t&b = "<<&b<<endl;
}
int main()
{
func(++i,i);
return 0;
}
然后我访问了一下0x70fe04处的数据发现,此时该处的数据变成了0
到了这里,我就不能理解了,将此处留给以后研究吧。
总结规律: ps:才疏学浅只能总结规律了,暂时给不出原理
将实参定义为局部变量时 func(++i,i)形式的传入有以下规律
1.从右至左的顺序求参数的值
2.参数计算完后并不会直接传入,会等待所有值计算完之后再传入,这一过程中会产生相互影响。
将实参定义为全局变量时
1.从右至左的顺序求参数的值
2.参数计算完之后直接传入,这一过程中不会产生相互影响
ps:教材一定是出错了