首页 > 试题广场 >

当参数*x=1, *y=1, *z=1时,下列不可能是函数a

[单选题]
当参数*x=1, *y=1, *z=1时,下列不可能是函数add的返回值的( )?
int add(int *x, int *y, int *z){
    *x += *x;
    *y += *x;
    *z += *y;
    return *z;
 }
  • 4
  • 5
  • 6
  • 7
推荐
D
开始不知道啥意思,后经牛客网的大神指点才知道这题要考虑的是,x,y,z三个参数是否指向同一地址(或者说调用该函数时是否实参相同),如:当a=b=c=1时,add(&a,&a,&a),add(&a,&b,&c)。
通过写程序测试得出结果,不可能得到答案7。
有以下5种情况

编辑于 2015-01-28 14:59:08 回复(16)
***。这题出的不错。学习一波
发表于 2016-07-07 10:30:39 回复(18)
是单选题?  不可能是的返回值是 B,C,D
发表于 2014-12-11 15:37:52 回复(1)
首先谢谢@编号2015的解答。
这里我给出了验证代码:
#include "StdAfx.h"
#include<stdio.h>
//在VS2010下运行通过
int add(int *x, int *y, int *z){
    *x += *x;
    *y += *x;
    *z += *y;
    return *z;
 }

void main()
{
 //划分三块内存区域
 int a=1,b=1,c=1;
 //注意经过一次add()之后,a,b,c的值有可能发生改变,注意要值要归1
 printf("指向同一内存区域%d\n",add(&a,&a,&a));
 a=1,b=1,c=1;
 printf("指向不同内存区域%d\n",add(&a,&b,&c));
 a=1,b=1,c=1;
 printf("x.y指向同一内存区域%d\n",add(&a,&a,&b));
 a=1,b=1,c=1;
 printf("x.z指向同一内存区域%d\n",add(&a,&c,&a));
 a=1,b=1,c=1;
 printf("y.z指向同一内存区域%d\n",add(&a,&c,&c));
 getchar();
}
结果:

编辑于 2015-03-11 16:09:09 回复(5)
分为如下情况,第一种x、y、z指向同一地址,如图1,z为8.第二种x、y指向同一地址,z为5.  第三种x、z指向同一地址,z为5,第四种x、y、z指向不同的地址 ,z为4,第五种y、z指向同一地址,z为6
发表于 2016-08-09 22:14:18 回复(7)
1、x!=y!=z,但指向的值都为1,此时*x+=*x后,*x=2,*y+=*x后,*y=3,*z+=*y后,*z=4;
2、x=y=z相同,指向同一个1,此时*x+=*x后,*x=2,*y+=*x后,*y=4,*z+=*y后,*z=8;
3、x=y!=z,但指向的值都为1,此时*x+=*x后,*x=2,*y+=*x后,*y=4,*z+=*y后,*z=5;
4、x!=y=z,但指向的值都为1,此时*x+=*x后,*x=2,*y+=*x后,*y=3,*z+=*y后,*z=6;
发表于 2018-08-10 21:18:45 回复(1)
我居然考虑多线程……
发表于 2015-09-13 13:05:42 回复(3)
看了别人的解释才懂,就是这三个形参的指针是否指向同一个实参,所以可能有三种类型:
1. 三个形参指向三个地址,此时返回值是4;
2. 任意两个指向同一个地址,剩下一个指向其他地址,此时返回值有可能是5或6;
3. 三个形参都指向同一个地址,则返回值是8。
发表于 2019-02-16 23:59:41 回复(0)
应该考虑x == y 或者 y == z或者 x == z的情况
发表于 2014-12-30 12:22:46 回复(0)

看了别人的代码,知道了结果,怎么来的呢?然后懂了,当x,y,z地址一样的时候,第一行为1+1,第二行2+2,第三行4+4,结果为8,其他的一样理解

发表于 2017-07-19 09:50:28 回复(0)
D  参数1的叠加运算  三个地址相同或不同
编辑于 2015-01-28 14:27:53 回复(0)
x,y,z公用一块地址,得8 x,y共用一块地址,得5 y,z共用一块地址,得6 独立地址,得4
发表于 2022-11-10 00:05:13 回复(0)

我去,看来以后指针得小心点用,要不然指向同一地址可那还得了。。。

发表于 2020-01-15 15:13:35 回复(0)
666
发表于 2018-07-20 20:58:02 回复(0)
参数*x==1, *y==1, *z==1时,则有可能x和y指针都同时指向一个为1的变量,才满足,(x指针对应的值==1,)这个boolean表达式,当这3个布尔表达式都满足时,要么3个指针指向不同的值为1的变量,要么指向相同的值为1的变量,或者2个相同一个不同。已知x,y,z都是1,因为这样才满足那3个布尔表达式,那么如果同一个区域,那么就是不断的自己加自己,就是8,不同就是1*2*2=4,2个同一个不同,要么5=2*2+1要么6=(1+2)*2
编辑于 2016-11-02 23:33:59 回复(0)
66666666666666666
发表于 2016-07-25 16:52:18 回复(0)
猜到了考查x,y,z指针是不是指向同一块内存的位置
发表于 2016-07-20 16:31:00 回复(0)
1.指针是否指向同一内存地址
发表于 2020-06-25 10:04:25 回复(0)
应注意3个指针所指向的地址是否相同。
编辑于 2019-03-03 17:05:46 回复(1)
随着x,y,z所指向区域的不同,值也不一样,如果指向同一区域,那么,不论x,y,z哪个变化,其他都会跟着变化
发表于 2017-08-29 20:03:30 回复(0)
要注意x,y,z指针可能指向同一地址,也可能指向不同的地址。
发表于 2016-05-24 16:59:59 回复(0)