帮助c ++逻辑?

时间:2011-09-27 22:49:18

标签: c++ logic

Something::methodname()
{  
    (unsigned char*) ptr = (unsigned char*) m_pptr;

    while ((*ptr || *(ptr+1)) && (((unsigned char*)m_pptr+BUFSIZE)<ptr))
        ptr++;

    if(ptr == m_pptr)
        return ptr; 

    return ptr + 1;
}

m_pptr是类的受保护成员。 ptr是此函数的本地

有人可以帮我解释这段代码的逻辑吗?我知道它编译但我得到的答案并不是我所期待的。我正在设置一个充满A5的缓冲区,而while循环以某种方式失败。它跳过了它。任何帮助都会很棒。

这将通过一个缓冲区,如果指针的值或(ptr+1)的值为true,它将递增指针并且ptr不能超过缓冲区的大小(由{找到) {1}}“指向缓冲区开头的指针”+缓冲区大小也必须为真。 if语句表示如果m_pptr(指向缓冲区开头的指针与m_pptr相同,则只返回指针。

此函数返回ptr并且不传递任何内容

3 个答案:

答案 0 :(得分:4)

 (((unsigned char*)m_pptr+BUFSIZE)<ptr))

向后看:

 (((unsigned char*)m_pptr+BUFSIZE)>ptr))

更有可能;更加理智:

while (ptr < ((unsigned char*) m_pptr + BUFSIZE)) // until end of buffer
{
    if (!*ptr)      // null char reached
        break;
    if (!*(ptr+1))  // null char almost reached
        break;

    // do stuff

    ptr++;
}

答案 1 :(得分:2)

这一点看起来很可疑:

 while ((*ptr || *(ptr+1))

想象一下,ptr指向一个有效的字符字节,后跟一个NUL终结符字节。

上述行的第一个子测试将评估为true,因此ptr会递增。现在ptr指向NUL终结器字节,*(ptr + 1)指向NUL终结器字节后的字节...可能是垃圾/未定义,因此可能是非零,此时(ptr )将再次递增(因为此时第二个子测试评估为真),因此ptr现在指向NUL终结符字节之后的字节。从那里开始你的指针进入la-la-land,试图解释那些从未打算成为解析字符串一部分的数据。

答案 2 :(得分:1)

如果使用for-loop代替它会不会更简洁,更简单?

for ( int i =0; i<BUFSIZE && (ptr[i] || ptr[i+1]); i++);

注意错误比较会更容易,不是吗? 而且我认为在这种情况下它应该更容易看到

for ( int i =0; i<(BUFSIZE-1) && (ptr[i] || ptr[i+1]); i++);

甚至

for ( int i =1; i<BUFSIZE && (ptr[i-1] || ptr[i]); i++);

除非你通过让BUFSIZE等于缓冲区大小减去1来解决这个问题。