今天在看资料时,看到一个“交换两个指定位置字符”的函数,代码如下:
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);
这句话没有看懂实现原理,还请懂的大侠能详细解读一下,谢谢了!
先不管如何实现,澄清目标是:
同时完成两件事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]),两步结果依此顺序写入。
关键点:赋值调用发生在堆栈,所以是先调用在写数据,可类比递归理解
哈哈!谢谢您的解答,我现在有一点明白了,看来还需要再看看堆栈方面的知识。
@ExDevilLee: 不是数据结构的堆栈,是操作系统的堆栈。
@漂泊的梦: 那您有什么好的资料推荐一下吗?我想了解的更多更详细一些,谢谢了