C - 链接列表:以下代码中的(!elem)是什么意思和(!(elem = * stack))?

时间:2014-02-20 18:45:55

标签: c list stack push pop

typedef struct Element 
{
    struct Element *next;
    void *data;
} Element;

在pop函数中,行(!(elem = * stack))是什么意思?

bool pop( Element **stack, void **data )
{
    Element *elem;
    if (!(elem = *stack)) return false;

    *data = elem->data;
    *stack = elem->next;
    delete elem;
    return true;
}

在推送功能中,线(!elem)是什么意思?

bool push( Element **stack, void *data )
{
    Element *elem = new Element;
    if(!elem) return false;

    elem->data = data;
    elem->next = *stack;
    *stack = elem;
    return true;
} 

2 个答案:

答案 0 :(得分:1)

在C中,当在布尔上下文中计算指针时,当且仅当它不是NULL时,它才会计算为 true 。那就是:

if (elem)

完全相同:

if (elem != NULL)

反过来说:

if (!elem)

等于:

if (elem == NULL)

关于oter case,赋值表达式作为一个整体,计算为指定的值。所以(elem = *stack)计算分配的指针。所以:

if (!(elem = *stack)) return false;

相当于:

elem = *stack;
if (elem == NULL) return false;

在这种情况下,这是没有实际意义,但想象elem是一个复杂的表达式:

if (!(array[a][b].element = *stack)) ...;

在这里,同时分配和使用的能力非常方便。

您可能已经在以下代码中看到过这个C功能,可能没有识别它:

a = b = c = 0;

真正被解析,因为赋值是右关联的):

a = (b = (c = 0));

答案 1 :(得分:0)

这是一个C crock。

在过去,一些非常糟糕的C教科书教导说

if (!foo) { ... }

更有效率
if (foo != 0) {... }

这出现在某些非常有影响力的地方,而且这种情况变得很普遍。

if (!(elem = *stack)) { ... }

更像是一样的。您将elem设置为等于堆栈顶部,并同时检查NULL。