Сегодня я видел пример кода, где обработка ошибок выполняется путем проверки, работает ли присвоение указателю. Я думаю, что если бы этого не произошло, он вернул бы false …
Мой вопрос это всегда будет работать? Не лучше ли просто проверить, nullptr
?
bool pop (Node *&stack, int *data){
Node *elem;
if (!(elem = stack)) return false; // isn't it better to say if (!stack)?
*data = elem->data;
stack = elem->next;
delete elem;
return true;
}
Постскриптум Этот код в основном является реализацией для pop
функция в стеке, реализованная с использованием структуры связанного списка Node
,
Заявление elem = stack
также является выражением, и значение этого выражения является значением, назначенным для elem
и не было ли назначение успешным. Так и есть, !(elem = stack)
это правда, если stack
ноль, потому что elem
будет назначено значение stack
даже если это ноль. У этого также есть побочный эффект назначения значения stack
к переменной elem
,
Вот почему код, как max = min = current;
используется, это означает, max = (min = current);
, Это, в свою очередь, на простом английском языке будет выглядеть так: назначить значение выражения min = current
к переменной max
, Оценка (min=current)
сам по себе дает побочный эффект от назначения current
в min
, По сути, все эквивалентно min=current; max=current;
Других решений пока нет …