为什么*=运算符没有按照我期望的方式运行?

Dan*_*ise 13 c++ operators

#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;
}
Run Code Online (Sandbox Code Playgroud)

因此,对于我正在进行的数学项目,如果在每次迭代期间将周长增加4/3x,我必须弄清楚9周长达到100所需的迭代次数.当我像上面那样编写代码时,输​​出很好,但是如果我改变的话

for(p; p < 100; p = p * 4/3)
Run Code Online (Sandbox Code Playgroud)

for(p; p < 100; p *= 4/3)
Run Code Online (Sandbox Code Playgroud)

我得到的输出没有意义.我误解了*=运算符吗?我需要在某个地方使用括号吗?

Jas*_*son 28

这是操作的顺序.在p = p * 4/3编译器中正在做:

p = (p * 4)/3
Run Code Online (Sandbox Code Playgroud)

但是p *= 4/3,编译器在做:

p = p * (4/3)
Run Code Online (Sandbox Code Playgroud)

由于整数除法,计算机上4/3为1,因此第二个示例基本上乘以1.

而不是除以3(整数),除以3.0(双精度)或3.0f(浮点数).那么p*= 4/3.0和p = p*4/3.0是相同的.

  • 或者得到所有的权利并写出`4./3`或`double(4)/ 3`或任何其他强制使用浮点运算的咒语. (6认同)
  • 如有疑问,请添加括号! (2认同)
  • 表达含义的最清楚的方式是`p*= 3.0/4.0` (2认同)
  • @KeithThompson是的,除了应该是'p*= 4.0/3.0` (2认同)