Сразу скажу, это связано с домашним заданием, с которым мне нужно руководство. Мне не нужен код или что-то еще, но это сводит меня с ума, и мне нужно некоторое разъяснение. Я даже не задаю вопрос в книге.
У меня есть следующий код:
int fun(int *c){
*c += 10;
return *c ;
}
void main(){
int a, b;
a = 10;
b = a + fun(&a);
printf("value of a is %d\n", a);
printf("With the function call on the right, ");
printf(" b is: %d\n", b);
a = 10;
b = fun(&a) + a;
printf("With the function call on the left, ");
printf(" b is: %d\n", b);
}
Когда я запускаю его, я получаю «значение a равно 20» и «с вызовом функции справа, 40» и «с вызовом функции слева, 40».
Что меня смущает, так это то, что у меня был очень похожий вопрос прямо перед
#include<stdio.h>
int fun(int *k) {
*k += 4;
return 3 * (*k) - 1;
}
void main() {
int i = 10, j = 10, sum1, sum2;
sum1 = (i / 2) + fun(&i);
sum2 = fun(&j) + (j / 2);
printf("%d", sum1);
}
И ответ получается 46 для sum1 и 48 для sum2, что, на мой взгляд, имеет смысл с оценкой слева направо в компиляторе codepad.org. Но в компиляторе Pelles C получается 48. Вы можете видеть, что код из первой задачи устроен почти точно так же.
Я нашел эту ссылку: Порядок оценки параметров перед вызовом функции C, что, кажется, объясняет это несоответствие, но я хочу убедиться, что не ошибаюсь в своих рассуждениях. Так можно ли с уверенностью сказать, что это зависит от компилятора и от того, что компилятор считает наиболее эффективным?
a + fun(&a)
, поэтому компилятор может сначала оценить либоa
, либоfun(&a)
. - person Some programmer dude   schedule 25.11.2014