由func(i,++i)产生的问题

今天在看到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:教材一定是出错了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值