1

研究一些资料我经常来看这个:(部分真实资料)

void CUserMng::AddText( LPCTSTR szMessage )
{
    map<u_long,CUser*>::iterator it;
    for( it = m_users.begin(); it != m_users.end(); ++it )
    {
        CUser *pUser = it->second;
        if( !IsValidObj( pUser ) )
            continue;

            (pUser)->AddTextNotice( szMessage );
    }
}

周围的括号是什么pUser意思?

我想出了:

struct bar
{
    int value;
}

void foo()
{
    bar *ptr = NULL; //new bar;
    (ptr)->value = 1;
    //delete bar
}

我的猜测是,带括号“ (ptr)”的调用是为了防止在指针无效时进行调用,但似乎不是。我经常看到的另一个例子是:

classB* ptr = new classB;
((classA*)ptr)->callfunctionfromclassA;
4

4 回答 4

4

在第一个示例中,括号没有做任何事情。

在第二种情况下,它们是必需的,因为如果省略它们,则表达式的含义会发生变化。通过->运算符选择成员的优先级高于类型转换。所以,如果你要写

(classA*)ptr->callfunctionfromclassA();

这意味着您将ptr->callfunctionfromclassA()调用的返回值转换为 a classA *。如示例中所写,您首先转换ptrclassA *type 然后调用callfunctionfromclassA;

于 2012-08-25T00:33:24.030 回答
2

第一个示例中的括号什么也不做。

在第二个示例中,parens 在取消引用之前强制转换指针。

于 2012-08-25T00:24:35.050 回答
2

周围的括号是什么pUser意思?

这意味着编写该代码的人不知道他在做什么。

我经常看到的另一个例子是:

classB* ptr = new classB;
((classA*)ptr)->callfunctionfromclassA;

这意味着无论谁写的仍然是用 Classes 编写 C,这种语言现在应该已经死了 15 年。

于 2012-08-25T00:40:57.257 回答
0

在第一种情况下,括号是多余的。它们可能是重构或样式偏好的结果。

在第二种情况下,这意味着classA*在取消引用之前将 ptr 强制转换为 a 。如果没有括号,您必须知道运算符的优先级才能知道发生了什么,因此代码更清晰、更安全。

于 2012-08-25T00:25:18.730 回答