c++逻辑帮助

Help with c++ logic?

本文关键字:帮助 c++      更新时间:2023-10-16
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是这个函数的局部

有人能帮我解释一下这段代码的逻辑吗?我知道它会编译,但我得到的答案并不是我所期望的。我正在memset一个充满A5的缓冲区,while循环不知何故失败了。它直接跳过了它。任何帮助都太好了。

这将通过一个缓冲区,如果指针的值或(ptr+1)的值为真,它将增加指针和ptr不能超过缓冲区的大小(这是由m_pptr"指向缓冲区开始的指针"+缓冲区大小)也必须为真。if语句表示,如果m_pptr(指向缓冲区开始的指针)与ptr相同,则只返回指针。

这个函数返回一个void*并且不传递任何参数

 (((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++;
}

我觉得这有点可疑:

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

假设ptr指向一个有效的字符字节,后跟一个NUL结束符字节。

上面一行的第一个子测试将求值为true,因此ptr被加1。现在ptr指向NUL终止字节,*(ptr+1)指向NUL终止字节后的字节…它可能是垃圾/未定义的,因此可能是非零的,此时(ptr)将再次递增(因为这次第二个子测试的值为true),因此ptr现在指向NUL终止字节之后的字节。从那里,你的指针头进入拉拉乐园,试图解释数据,从来没有打算成为字符串的一部分,它正在解析。

如果使用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++);