2014-02-20 1 views
0
typedef struct Element 
{ 
    struct Element *next; 
    void *data; 
} Element; 

В функции pop, что означает линия (! (Elem = * stack))?C - Связанный список: Что означает (! Elem) и (! (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; 
} 
+0

Это означает, если * stack равен 0, верните false. В функции push это означает, что elem равен 0, то есть не создан. – cup

ответ

1

В C, когда указатель оценивается в булевом контексте, он вычисляет true тогда и только тогда, когда он не является NULL. То есть:

if (elem) 

точно такой же, что:

if (elem != NULL) 

И, наоборот:

if (!elem) 

равна:

if (elem == NULL) 

О OTER случае присвоения выражение в целом оценивает e присвоенное значение. Таким образом, (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)); 
+0

Спасибо Родриго, это была огромная помощь, и я сразу понял свое понимание.Еще раз спасибо. – Ubez

0

Это C crock.

В старые времена, некоторые действительно плохие учебники C учил, что

if (!foo) { ... } 

был более эффективен, чем

if (foo != 0) {... } 

Это проявилось в некоторых весьма влиятельных местах, и глиняный стали обычным делом.

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

- больше того же. Вы устанавливаете elem равным вершине стека и одновременно проверяете NULL.

 Смежные вопросы

  • Нет связанных вопросов^_^