单选题
8.若有以下程序段:int a=3,b=4; a=a^b;b=b^a;a=a^b;则执行以上 语句后,a和b的值分别是()。
A
a=3,b=4
B
a=4,b=3
C
a=4,b=4
D
a=3,b=3
答案解析
正确答案:B
解析:
这道题考查的是利用**异或运算符(^)**交换两个变量值的经典算法。
### 1. 核心知识点:异或运算的性质
异或运算(XOR)具有以下重要性质,这是解题的关键:
1. **自反性**:任何数与自身异或,结果为0。即 $x \oplus x = 0$。
2. **恒等性**:任何数与0异或,结果为其本身。即 $x \oplus 0 = x$。
3. **交换律和结合律**:$a \oplus b = b \oplus a$,$(a \oplus b) \oplus c = a \oplus (b \oplus c)$。
基于以上性质,可以推导出:**如果 $c = a \oplus b$,那么 $c \oplus a = b$ 且 $c \oplus b = a$。**
### 2. 逐步执行分析
初始状态:
* $a = 3$
* $b = 4$
**第一步:`a = a ^ b;`**
* 计算 $3 \oplus 4$。
* $3$ 的二进制:`011`
* $4$ 的二进制:`100`
* 异或结果:`111` (即十进制的 7)
* 此时变量状态:
* $a = 7$ (存储了 $3 \oplus 4$ 的结果)
* $b = 4$ (保持不变)
**第二步:`b = b ^ a;`**
* 注意:此时的 $a$ 已经是 7 了。
* 计算 $b \oplus a$,即 $4 \oplus 7$。
* $4$ 的二进制:`100`
* $7$ 的二进制:`111`
* 异或结果:`011` (即十进制的 3)
* **逻辑推导**:$b = b \oplus (a_{old} \oplus b_{old}) = a_{old}$。所以这一步实际上是将 $a$ 的原始值赋给了 $b$。
* 此时变量状态:
* $a = 7$ (保持不变)
* $b = 3$ (变成了 $a$ 的初始值)
**第三步:`a = a ^ b;`**
* 注意:此时的 $a$ 是 7,$b$ 是 3。
* 计算 $a \oplus b$,即 $7 \oplus 3$。
* $7$ 的二进制:`111`
* $3$ 的二进制:`011`
* 异或结果:`100` (即十进制的 4)
* **逻辑推导**:$a = (a_{old} \oplus b_{old}) \oplus a_{old} = b_{old}$。所以这一步实际上是将 $b$ 的原始值赋给了 $a$。
* 此时变量状态:
* $a = 4$ (变成了 $b$ 的初始值)
* $b = 3$ (保持上一步的结果)
### 3. 最终结果
执行完所有语句后:
* $a = 4$
* $b = 3$
这与选项 **B** 相符。
### 结论
该程序段实现了变量 $a$ 和 $b$ 值的交换,无需使用临时变量。
故正确答案为 **B**。
题目纠错
c语言选择判断题库
相关题目
单选题
1、下列程序的输出为()。 main() 
单选题
1、假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};, 则数组x在内存中所占字节数是()。
单选题
1、下列字符序列中,不可用作C语言标识符的是()。
单选题
1、若有说明:int a[][3]={1,2,3,4,5,6,7};则a数组第一维的大小是()。
单选题
1、已知字母a的ASCII十进制代码为97,则执行下列语句后的输出结果为()。char a='a'; a--; printf(”%d,%c\n”,a+'2'-'0',a+'3'-'0');
单选题
1、对以下说明语句 int a[10]={6,7,8,9,10}; 的正确理解是()。
单选题
1、若有说明:int a[10];则对a数组元素的正确引用是()。
单选题
1、以下数据中,不正确的数值或字符常量是()。
单选题
9.以下数组定义中不正确的是()。
单选题
8.设有 int x=11; 则表达式 (x++ * 1/3) 的值是()。
