【问题标题】:Linked List: What does (!elem) mean and (!(elem = *stack)) in the following code?链表:以下代码中的 (!elem) 和 (!(elem = *stack)) 是什么意思?
【发布时间】:2014-02-20 18:45:54
【问题描述】:
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;
}

push函数中,(!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;
} 

【问题讨论】:

  • 如果*stack为0,则返回false。在 push 函数中,这意味着如果 elem 为 0 即未创建。

标签: c list stack


【解决方案1】:

在 C 中,当指针在布尔上下文中求值时,当且仅当它不为 NULL 时,它的求值结果为 true。那就是:

if (elem)

完全一样:

if (elem != NULL)

反过来说:

if (!elem)

等于:

if (elem == NULL)

关于其他情况,赋值表达式作为一个整体,计算为赋值的值。所以(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));

【讨论】:

  • 谢谢罗德里戈,这是一个巨大的帮助,并立即澄清了我的理解。再次感谢您。
【解决方案2】:

这是一个 C 缸。

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

if (!foo) { ... }

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

这出现在某些非常有影响力的地方,并且瓦罐变得很普遍。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多