【问题标题】:Help with c++ logic?帮助 c++ 逻辑?
【发布时间】:2011-09-27 22:49:18
【问题描述】:
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 不能超过缓冲区的大小(由 m_pptr 找到“指向缓冲区开头的指针”+缓冲区大小)也必须为真。 if 语句表示如果 m_pptr(指向缓冲区开头的指针与 ptr 相同,则只返回指针。

这个函数返回一个void* 并且什么都不传递

【问题讨论】:

  • 我认为你在某处有一个流浪花括号
  • 你实际上并没有说出你期望代码做什么......
  • 我很确定它不会编译。
  • 很难说这里要问什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。投票结束,推荐here

标签: c++ logic


【解决方案1】:
 (((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 不能大于缓冲区大小
【解决方案2】:

我觉得这有点可疑:

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

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

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

【讨论】:

    【解决方案3】:

    如果换成 for 循环,会不会看起来更简洁?

    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 等于缓冲区大小减一来解释这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      相关资源
      最近更新 更多