csapp第二章:信息的表示和处理练习题2.10 2.11

对于练习题2.10所示的交换函数
咋一看是这个道理,利用^符号达到交换的目的,实际上由练习题2.11可以知道,它隐含了地假设了*x与*y不指向同一位置
我们知道 对于任意a,a^a=0,对于2.10这个函数来说,*x与*y指向同一位置就明显的无法达到交换的目的,反而将值置0了
而下面的填空很简单,^符号的运算满足结合律和交换律,可以很简单地算出

对于练习题2.11的调换函数
同样的也是咋一看似乎没问题,可以达到交换目的,但是这只是对于偶数长度序列而言的
题目所要求的是两两交换,即前后位置对称的交换,只适用于偶数对,一旦是奇数对,则其中的first和last最后会指向中间的同一个值,将他们传入练习2.10的函数中,根据上面举的例子,可以明显的知道,他们没有交换,反而是置为0了
解决这个问题也很简单,对于交换数对,若是奇数序列,我们不需要交换中间的值,因此循环不必要到first<=last,无需循环他们指向同一值的情况,因此到first<last即可
但是即便这样还是有个致命缺陷,即若是序列中对称的两个位置的值相同,此时调用2.10的交换函数同样的无法实现交换而是置为0
这个问题只需输入的序列不重复即可解决

posted @ 2022-10-19 10:56  风乐  阅读(74)  评论(0)    收藏  举报