CString::Find 返回错误值

Jef*_*f G 1 mfc visual-studio visual-c++

我在 Visual C++ MFC 应用程序中有以下示例代码。CString::Find返回错误的值,我看不出问题是什么:

int     nPos;
CString s, s1;
TCHAR   c1, c2;

s = _T("D)1234");
if (nPos = s.Find(_T("D)")) >= 0)
{
    c1 = s.GetAt(0);
    c2 = s.GetAt(1);
    s1 = s.Mid(nPos + 2);
}
Run Code Online (Sandbox Code Playgroud)

我在调试器中得到的结果是:

nPos = 1 (should be 0)
c1 = 'D' (as expected)
c2 = ')' (as expected)
s1 = "234" (instead of "1234" because Find returned the wrong value)
Run Code Online (Sandbox Code Playgroud)

这是使用 Microsoft Visual Studio Community 2022(64 位)版本 17.0.5

use*_*902 7

问题不在于CString::Find返回正确的值,这可以通过移出条件0来看到。s.Find

nPos = s.Find(_T("D)"));
if (nPos >= 0)

Output: nPos = 0 (As expected)
Run Code Online (Sandbox Code Playgroud)

问题是你如何拥有括号,你有:

if (nPos = s.Find(_T("D)")) >= 0)
Run Code Online (Sandbox Code Playgroud)

因为>=具有比=这更高的优先级,实际计算为nPos = (s.Find(_T("D)") >= 0)

但是,对于条件内的赋值,您应该具有以下内容:

if ((nPos = s.Find(_T("D)"))) >= 0)
Run Code Online (Sandbox Code Playgroud)

如需进一步阅读,请查看CWE-783 运算符优先级逻辑错误