Как выглядит операция сложения в промежуточном коде / трехадресном коде?

Если я напишу функцию следующим образом

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--?

0 ответов

Другие вопросы по тегам