Какие функции порядка будут называться

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

Применяется ли следующее правило: В C порядок, в котором аргументы функций и операндов для большинства операторов оцениваются, не указан. Набрал указанное правило на этой вики-странице

a = (f1(10, 20) * f2(30, 40)) + f3() 

    Это правило применяется. f1 , f2 и f3 могут быть оценены в любом порядке.

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

     f1() * f2() + f3() 

    Теперь мы знаем, что да, результаты f1() и f2() умножаются, а затем добавляются к результату f3() , но мы не знаем порядок оценки . Дерево parsingа выглядит так:

      + / \ * f3() / \ f1() f2() 

    Но мы не знаем, будет ли сначала оценена левая или правая сторона + . Это может быть так или иначе. То же самое с * : мы не знаем, будет ли сначала оценена его левая или правая сторона.

    Компилятор может вызвать f3() , затем сохранить результат, затем вызвать f2() , сохранить этот результат, а затем вызвать f1() , а затем использовать сохраненные результаты для выполнения фактического вычисления.

    Или, в качестве альтернативы, он может вызвать f1() , сохранить результат, затем вызвать f2() , затем использовать два значения для умножения (и затем сохранить этот результат), затем вызвать f3() и завершить вычисление.

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

    В заключение: приоритет оператора определяет дерево parsingа, а не порядок оценки . Порядок, в котором оценивается дерево parsingа, не определен.

    Компилятор может вызывать эти функции в любом порядке (т. Е. Единственная гарантия заключается в том, что f1 и f2 вызывается перед умножением, и все три вызываются перед добавлением и что все три будут вызываться только после значения их аргументов известен).

    С такими буквальными аргументами компилятор может называть их как можно раньше (например, строки и строки выше) или даже сделать их встроенными.

    Самое главное, не путать приоритет оператора с порядком оценки функции.

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

    Эти функции могут быть оценены в любом порядке. Нет определенного правила. Либо f1 сначала оценивается, либо f2 а затем f3 или f3 оценивается сначала, а затем f2 а затем f1 или f2 оценивается сначала, а затем f1 а затем f3 или даже f1 сначала оценивается f3 а затем f2 (здесь всего шесть комбинаций!).

    Здесь следует отметить следующее: приоритет оператора не имеет ничего общего с порядком оценки .

    Но имейте в виду, что когда-либо был порядок оценки этих функций, арифметическая операция над выражением

     a = (f1(10, 20) * f2(30, 40)) + f3() 

    будет принимать дворец в соответствии с правилом приоритета оператора, т. е. сначала выполняется f1*f2 (во время оценки f1 и f2 ), а затем результат этого добавляется к f3 (все оценки f1 , f2 и f2 должны быть оценены) ,