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
并且不传递任何内容
答案 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来解决这个问题。