Either君 level
获赞
0
粉丝
0
关注
0
看过 TA
0
中南民族大学
C++
IP属地:未知
暂未填写个人简介
私信
关注
2015-08-14 08:20
中南民族大学 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
投递人人网等公司7个岗位 >
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务