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;
}
答案 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。