首页 新闻 会员 周边 捐助

有关“交换两个指定位置字符”的函数的疑问

0
悬赏园豆:15 [已解决问题] 解决于 2013-11-30 09:16

今天在看资料时,看到一个“交换两个指定位置字符”的函数,代码如下:

        static void Main(string[] args)
        {
            string s = "123456789";
            Console.Write(SwapChar(s, 3, 6).ToString());
        }

        static string SwapChar(string s, int p1, int p2)
        {
            if ((p1 == p2) || ((p1 < 0) || (p2 < 0))) return s;
            if ((p1 >= s.Length) || (p2 >= s.Length)) return s;
            char[] vChars = s.ToCharArray();
            vChars[p1] = (char)(vChars[p2] | (vChars[p2] = vChars[p1]) & 0);
            return new string(vChars);
        }

我的疑问:

vChars[p1] = (char)(vChars[p2] | (vChars[p2] = vChars[p1]) & 0);
这句话没有看懂实现原理,还请懂的大侠能详细解读一下,谢谢了!

ExDevilLee的主页 ExDevilLee | 初学一级 | 园豆:184
提问于:2013-11-28 23:43
< >
分享
最佳答案
0

先不管如何实现,澄清目标是:

同时完成两件事vChars[p2] = vChars[p1] 和 vChars[p1] = vChars[p2]

 第一件事由(vChars[p2] = vChars[p1])完成,但是这一部是在堆栈中,所以结果没有立即写;

 第二件事是通过vChars[p1] = (char)(vChars[p2]|0)完成的,(vChars[p2] = vChars[p1]) & 0的结果是0;

等执行最左边等号结束后,清除堆栈时会将vChars[p1] = (vChars[p2]) ,(vChars[p2] = vChars[p1]),两步结果依此顺序写入。

关键点:赋值调用发生在堆栈,所以是先调用在写数据,可类比递归理解

收获园豆:15
漂泊的梦 | 菜鸟二级 |园豆:217 | 2013-11-29 13:48

哈哈!谢谢您的解答,我现在有一点明白了,看来还需要再看看堆栈方面的知识。

ExDevilLee | 园豆:184 (初学一级) | 2013-11-29 14:20

@ExDevilLee: 不是数据结构的堆栈,是操作系统的堆栈。

漂泊的梦 | 园豆:217 (菜鸟二级) | 2013-11-29 18:26

@漂泊的梦: 那您有什么好的资料推荐一下吗?我想了解的更多更详细一些,谢谢了

ExDevilLee | 园豆:184 (初学一级) | 2013-11-29 23:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册