Почему оператор * = не работает так, как я ожидал? - программирование

Почему оператор * = не работает так, как я ожидал?

#include <iostream>
using namespace std;

int main ()
{
    //If a triangle has a perimeter of 9 units, how many iterations(each iteration is 4/3 as much) would it take to obtain a perimeter of 100 units? (or as close to 100 as you can get?)
    double p = 9; int it = 0;
    for(p; p < 100; p = p * 4/3){
        cout << p << endl;
        it++;
    }
    cout << p << endl;
    cout << it << endl;
    system ("PAUSE");
    return 0;
}

Итак, для математического проекта, который я делал, мне нужно было выяснить, сколько итераций потребуется для периметра 9, чтобы достичь 100, если вы увеличите периметр на 4/3 столько же за каждую итерацию. Когда я пишу код, как я делаю выше, вывод прекрасен, однако если я изменяю

for(p; p < 100; p = p * 4/3)

к

for(p; p < 100; p *= 4/3)

Я получаю вывод, который не имеет смысла. Неужели я не понимаю оператора * =? Мне где-то нужны скобки?

4b9b3361

Ответ 1

Это порядок работы. В p = p * 4/3 выполняется компилятор:

p = (p * 4)/3

Однако в p *= 4/3 компилятор делает:

p = p * (4/3)

4/3 - 1 на компьютере из-за целочисленного деления, поэтому второй пример в основном умножается на 1.

Вместо деления на 3 (целое число) разделите на 3.0 (double) или 3.0f (float). Тогда p * = 4/3.0 и p = p * 4/3.0 одинаковы.