2014-10-12 3 views
0

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

+2

возможный дубликат [Поясните порядок evalution в Printf] (http://stackoverflow.com/questions/12960241/explain-the -order-of-evalution-in-printf) – 2501

+2

Возможный дубликат [Порядок оценки параметров перед вызовом функции C] (http://stackoverflow.com/questions/376278/parameter-evaluation-order-before-a-function -calling-in-c) – WhozCraig

+0

Вы знаете, что "* оценка выражения [an] [s] *" означает/is? – alk

ответ

3

Просто не зависеть от этого. Если у вас есть код:

func(a(), b(), c()); 

Тогда порядок исполнения a(), b() и c() не имеет значения для правильности вашей программы. Если это так (например, если a() открывает ресурс, и c() закрывает его), то у вас есть что-то опасное здесь.

Самый простой обходной путь, чтобы написать такой код, как это:

int a_result = a(); 
int b_result = b(); 
int c_result = c(); 
func(a_result, b_result, c_result); 
1

Вот упрощенный пример:

SomeCall(Writefile(handle) , Closefile(handle)) ; 

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

+0

Почему это «логически выглядит правильно»? Мне кажется, что вы делаете то, что должно быть заказано без заказа, то есть неверно. –

+0

@KerrekSB Потому что мы читаем слева направо и вниз. Например, код может быть разделен на отдельные строки. Помните, что OP не является экспертом, а логика играет определенную роль. – 2501

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