首页 > 试题广场 >

数组定义如下: int arr[2] = {10,20};

[不定项选择题]
数组定义如下:
int arr[2] = {10, 20};
下列函数的作用是,将数组中的两个数值进行交换,即调用函数后,arr变为{20,10},
voidchange(int* p) {
/*……*/
}
若要正确实现函数功能,/*……*/为()
  • int temp = p[0];
    p[0] = p[1];
    p[1] = temp;
  • p[0] = p[0] ^ p[1];
    p[1] = p[1] ^ p[0];
    p[0] = p[0] ^ p[1];
  • int n1 = p[0];
    int n2 = p[1];
    int temp = n1;
    n1 = n2;
    n2 = temp;
  • int temp = *p;
    *p = *(p+1);
    *(p+1) = temp;
真的求求出题人认真一些
发表于 2019-09-25 11:36:35 回复(1)

假设a,b为两个不同的整数,则:

a^a=0   b^b=0

同时异或满***换律和结合律:

a^b=b^a  

(a^b)^c=a^(b^c) 

现在我们写交换的语句:

a=a^b    

b=a^b     //因为我们上面写了a=a^b,所以这里的b=a^b=(a^b)^b=a^(b^b)=a^0=a

a=b^a     //因为上面b已经是a了,所以结合第一步就有a=b^a=a^(a^b)=(a^a)^b=0^b=b

发表于 2022-03-15 14:59:31 回复(0)
答案B修改为:
p[0] =10=(00001010),p[1]=(00010100)                       ^异或运算
p[0] = p[0]^p[1]=(00001010)^(00010100)=(00011110)       
p[1] = p[1]^p[0]=(00010100)^(00011110)=(00001010)=10
p[0] = p[0]^p[1]=(00011110)^(00001010)=(00010100)=20
p[0] =20,p[1]=10
发表于 2019-11-02 11:09:59 回复(1)
C为啥错
发表于 2019-08-05 21:04:22 回复(3)
这个B是错的
发表于 2019-07-06 21:51:01 回复(4)
答案B修改为:
p[0] =10=(00001010),p[1]=(00010100)                       ^异或运算(相同取0,不同取1)
p[0] = p[0]^p[1]=(00001010)^(00010100)=(00011110)       
p[1] = p[1]^p[0]=(00010100)^(00011110)=(00001010)=10
p[0] = p[0]^p[1]=(00011110)^(00001010)=(00010100)=20
p[0] =20,p[1]=10
则对
发表于 2020-04-08 18:03:26 回复(0)

选项 A:

cppCopy Code
int temp = p[0]; p[0] = p[1]; p[1] = temp;

这段代码通过使用数组下标访问来交换数组元素的值。首先,将p所指向的第一个元素的值保存在临时变量temp中。然后,将p所指向的第一个元素的值更新为p所指向的第二个元素的值。最后,将p所指向的第二个元素的值更新为临时变量temp的值,即完成了交换操作。

选项 B:

cppCopy Code
p[0] = p[0] ^ p[1]; p[1] = p[1] ^ p[0]; p[0] = p[0] ^ p[1];

这段代码使用异或运算来交换数组元素的值。通过连续进行异或操作,可以实现两个变量的交换而不需要额外的临时变量。具体地,先将p所指向的第一个元素与第二个元素进行异或操作,并将结果赋值给第一个元素,然后再将p所指向的第二个元素与新的第一个元素进行异或操作,并将结果赋值给第二个元素。最后,再将新的第一个元素与新的第二个元素进行异或操作,并将结果赋值给第一个元素,即完成了交换操作。

选项 D:

cppCopy Code
int temp = *p; *p = *(p+1); *(p+1) = temp;

这段代码通过使用指针来交换数组元素的值。首先,将指针p所指向的第一个元素的值保存在临时变量temp中。然后,通过指针算术运算*(p+1)取得指针p所指向的第二个元素的值,并将该值赋值给指针p所指向的第一个元素。最后,将临时变量temp的值赋值给指针p所指向的第二个元素,即完成了交换操作。

发表于 2023-10-20 21:00:13 回复(0)
B选项,a^b^a == b
编辑于 2020-10-05 17:10:00 回复(0)
c选项只改变了局部变量n1,n2的值,但是p数组的元素值不变
发表于 2021-05-07 21:17:21 回复(0)

b怎么能对 这答案

发表于 2019-08-30 10:37:03 回复(1)
B选项是按位异或,确实也能起到交换的作用。
发表于 2019-06-09 11:47:19 回复(3)
D为啥对?他明明跟C一样,都是值传递,又不是指针传递
发表于 2023-09-06 16:05:26 回复(0)
兄弟们,B是对的。
#include<iostream>
using namespace std;
void voidchange(int *p)
{
    p[0]=p[0]^p[1];
    p[1]=p[1]^p[0];
    p[0]=p[0]^p[1];
}
int main()
{
    int arr[2]={10,20};
    voidchange(arr);
    cout<<arr[0]<<" "<<arr[1]<<endl;
    return 0;
}

发表于 2023-05-18 01:08:30 回复(0)
现在B改回来了,大家放心做题😁
发表于 2023-03-08 08:34:00 回复(0)
<p>C中交换局部变量,不影响原本数组值得变化</p>
发表于 2020-08-01 21:08:42 回复(0)
<p>B选项这个下标为2?开玩笑的吗?</p>
发表于 2020-05-28 19:29:51 回复(0)
这个题挺基础的感觉(基础不行,看了好久),数组当作实参传递,形参可以是指针或数组。
A选项交换值p[0],*p一样的都是值的交换,所以是正确的。
B选项(下标写错了),p[0] =  p[0] ^ a[1]  p[0] 00001010 10
                              30                        p[1] 00010100 20
                                                          p[0] 00011110  30
                               p[1] = p[1] ^ p[0]  p[1] 00010100 20
                                10                      p[0] 00011110 30
                                                          p[1] 00001010 10
                               p[0] = p[0] ^ p[1]  p[0] 00011110   30
                                20                      p[1] 00001010  10
                                                          p[0] 00010100  20
                                交换前 arr[2]={10,20}
                                交换后 arr[2]={20,10),正确。
C选项,交换n1和n2的值,错误。
D选项,指针指向10和20交换,正确。
发表于 2020-01-21 15:04:28 回复(0)
关于b new1=1^2 new2=2^1^2=1 newnew1=1^2^1=2
发表于 2019-09-12 19:53:36 回复(0)

b咋解释 求大佬

发表于 2019-09-09 07:57:08 回复(3)
B为啥对,指针传递下去都没有对p[0]进行操作,怎么实现数据交换,下标虽然是异界,但是程序应该是能跑的,p2表示的是p指针后第8个字节后的数据,cout一下是能看到结果的
发表于 2019-08-09 21:40:33 回复(0)