Неверный вывод при запуске кода C

Возможный дубликат:
Порядок оценки параметров перед вызовом функции C

Для нижеприведенного кода я ожидал, что вывод будет 20 и 76, но вместо этого 75 и 21 отправляются в качестве вывода. Пожалуйста, объясните, почему это так.

#include unsigned func(unsigned n) { unsigned int a =1 ; static unsigned int b=2; a+=b; b+=a; { unsigned int a=3; a+=b; b+=a; } //printf("%d %d ",a,b); return (n+a+b); } int main() { printf("%d %d\n",func(4),func(5)); return 0; } 

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

Порядок оценки func (4) и func (5) не определяется стандартом C (s).

Порядок оценки выражения – unspecified behaviour поэтому func(4) и func(5) можно вызвать в другом порядке, как вы предполагали

Возможно, вам захочется посетить его еще раз

Компиляторы и порядок аргументов оценки в C ++

Порядок оценки параметров перед вызовом функции C

Аргументы переносятся в стек в обратном порядке. Кажется, в вашей реализации компилятора func(5) вызывается перед func(4) .

Причиной может быть порядок оценки. Так как,

 //printf("%d %d\n",func(4),func(5)); printf("%d \n",func(4)); printf("%d \n",func(5)); 

печать

 20 76 

Функция func (5) выполняется сначала:

Значения переменных после выполнения функции func (5):

 a = 3 b = 13 func(5) = 21 

Так как b статично, значения после выполнения функции func (4):

 a = 14 b = 57 func(4) = 75 

Код прост, и помните, что static переменные сохраняют свои значения между вызовами функций.

В вашей программе, в связи с вашим компилятором (таким образом, конкретный компилятор, не определенный стандартами):

func(5) выполняется первым, который возвращает 21 .. объяснение:

  unsigned func(unsigned n) /*first with 5*/ { unsigned int a =1 ; static unsigned int b=2; a+=b; b+=a; // a = 3, b = 5 { unsigned int a=3; a+=b; b+=a; // a = 8, b = 13 } //printf("%d %d ",a,b); return (n+a+b); // 5 + 3 + 13 = 21. } 

func (4) выполняется следующим образом,

объяснение:

  unsigned func(unsigned n) /*first with 5*/ { unsigned int a =1 ; static unsigned int b=2; a+=b; b+=a; // a = 14, b = 27 { unsigned int a=3; a+=b; b+=a; // a = 30, b = 57 } //printf("%d %d ",a,b); return (n+a+b); // 4 + 57 + 14 = 75(which is printed first). } 

Отсюда вывод.

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

Лучшим альтернативом в таком сценарии является функция вызова и сохранение возвращаемых значений, а затем использование их в printf или создание двух разных вызовов printf.

побочные эффекты