人人网的一道c++程序题

当参数 *x==1,*y==1,*z==1时,下列不可能是函数add的返回值的是()?
int add(int *x,int *y,int *z)
{
    *x += *x;
    *y += *x;
    *z += *y;

    return *z;
}

A 4
B 5
C 6
D 7

这个函数的返回值 不应该就是4吗?=。=。。。求大神解释。。。
全部评论
是要考虑并发的情况吧,结果是4当且仅当所有语句顺序执行的时候 结果是6也容易理解: (1)线程1执行完*x += *x,*x现在变为2 (2)线程1被打断,线程2进入,执行完*x += *x,*x现在变为4 (3)线程2被打断,线程1执行完*y += *x,*z += *y,即得到*z = 6了 注意到右结合操作符+=并非原子操作,结果为5也是可能的: (1)线程1执行*x += *x,先取右操作数*x,值为1,当取左操作数时被打断,线程2进入 (2)线程2执行完*x += *x,由于此时*x仍然为1,所以得到*x = 2,此时线程2也被打断,线程1继续执行 (3)线程1的+=操作取左操作数*x,值已经是2了,从而写回*x后,*x变为3,接着线程1执行完第二条和第三条语句,就得到*z = 5了 实际上,返回值等于7也是可能的: (1)线程1执行*x += *x,取右操作数*x,值为1,然后被打断,线程2进入 (2)线程2执行*x += *x,取右操作数*x,值为1,然后被打断,线程1继续 (3)线程1执行完*x += *x,取左操作数*x,值为1,加上1写回*x,*x变为2,然后被打断,线程3进入 (4)线程3执行完*x += *x,此时*x变为4,然后被打断,线程2继续 (5)线程2取左操作数*x,值为4,加上1写回*x,*x变为5,然后被打断,线程1继续 (6)线程1执行完*y += *x,*y变为6,执行完*z += *y,*z变为7
点赞 回复 分享
发布于 2015-08-14 10:40
请考虑不同的指针有可能指向同一个对象的情况。 x==y && y==z   返回值是8。 x==y && y!=z    返回值是5。 x!=y  && x==z    返回值是5。 x!=y  && y==z   返回值是6。 x!=y  && y!=z    返回值是4。
点赞 回复 分享
发布于 2015-08-19 11:50
你应该没有考虑 x y z指针可能指向相同的地址情况吧
点赞 回复 分享
发布于 2015-09-28 01:02
你应该没有考虑 x y z指针可能指向相同的地址情况吧
点赞 回复 分享
发布于 2015-09-28 01:02
你应该没有考虑 x y z指针可能指向相同的地址情况吧
点赞 回复 分享
发布于 2015-09-28 01:02

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务