Как выглядит операция сложения в промежуточном коде / трехадресном коде?
Если я напишу функцию следующим образом
int sum(int i)
{
if(!i)
return 0;
return sum(i--) + i; //this line
}
Как компилятор представляет оператор возврата в терминах трехадресного кода / промежуточного кода? Есть ли
1) return i-- + sum(i) differ from 2) return sum(i) + i--?
Моя интерпретация заключается в том, что в первом случае, если i добавляется, а затем sum рекурсивно вызывается с i-1 в качестве параметра, а в другом случае sum вызывается с i в качестве параметра и i-1 добавляется к нему. Это правильно? Может кто-нибудь объяснить, что происходит на уровне компилятора?
И что если изменить 1) и 2) как
1)return i + sum(i--) and 2) return sum(i--) + i
что происходит в рекурсивном смысле? Я думаю, это будет бесконечный цикл, но как насчет i--?