2016-03-30 3 views
1

Думаю, я мог бы знать ответ на этот вопрос, но я хотел убедиться, что полностью понимаю.Вычисление очереди по функциональным параметрам

Я написал структуру очереди в C, а также операции для использования в структуре очереди. Я хотел бы выставить очередь, извлекая один элемент. Этот элемент будет первым параметром в моей функции. Я хотел бы снова поместить очередь, извлекая второй элемент. Этот второй элемент будет моим вторым параметром.

Например:

e1 = pop(Q); 
e2 = pop(Q); 
myfunction(e1, e2); 

Я хотел бы сделать это в дождевика образом, что не требует меня, чтобы сделать две холостые переменные.

Мое предположение было бы следующее:

myfunction(pop(Q), pop(Q)) 

Но я не уверен на 100%, если это правильно.

Это правильно? Существуют ли более простые способы достижения этого?

+0

* дождевик * не значит лучше. Хотя ваше предположение является синтаксически правильным, оно подвержено множественным ошибкам во время выполнения. –

ответ

2

Порядок оценки аргументов функции не определен, поэтому второй фрагмент может быть или не быть эквивалентным первому.

В этом случае myfunction(pop(Q), pop(Q)) приводит к неопределенному поведению.

См. Также Compilers and argument order of evaluation in C.

0

В дополнение к ответу Майкла, если это часто повторяющаяся конструкция, вы также можете сделать функцию myFunctionFromQueue(Q), которая отбросит шаблон.

Кроме того, если вы не появляются Интс или аналогичные, более реалистичный код будет в конечном итоге выглядит как:

e1 = pop(Q) 
e2 = pop(Q) 
myFunction(e1, e2) 
manage_ownership(e1) 
manage_ownership(e2)