袁瑞's profile袁瑞的共享空间PhotosBlogGuestbookMore Tools Help

Blog


    May 23

    操作符“=”的巧妙用法和陷阱

    写程序久了,一直习惯了a=b=c的代码方式。今天才发现其中也有玄机。

    模仿STL的list写了一个list的迭代器

    其中的插入方法如下:

    Iterator insert(iterator itr, const Object &x)

    {

        ListNode* p= itr.current;

        ListNode* newnd = new ListNode(x, p->prev, p); //创建一个新的节点,参数分表为:节点数据、上一个节点、下一个节点

        p->prev->next = newnd;

        p->prev = newnd;

        return iterator(newnd);

    }

    我将此段代码简化后为:

    Iterator insert(iterator itr, const Object &x)

    {

        ListNode* p= itr.current;

        return iterator(p->prev->next = p->prev = new ListNode(x, p->prev, p) );

    }

    执行结果错误。

    分析后才发现,a=b=c的代码,分解后是b=c;a=c ,导致以上错误出现。

     

    正确代码应该是:

    Iterator insert(iterator itr, const Object &x)

    {

        ListNode* p= itr.current;

        return iterator(p->prev = p->prev->next = new ListNode(x, p->prev, p) );

    }