【问题标题】:Why is the *= operator not functioning the way I would expect it to?为什么 *= 运算符没有按我期望的方式运行?
【发布时间】:2013-05-06 20:47:06
【问题描述】:
#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;
}

因此,对于我正在做的一个数学项目,如果在每次迭代期间将周长增加 4/3 倍,我必须计算出周长为 9 达到 100 需要多少次迭代。当我像上面那样编写代码时,输​​出很好,但是如果我改变了

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

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

我得到了没有意义的输出。我误解了 *= 运算符吗?我在某处需要括号吗?

【问题讨论】:

    标签: c++ operators


    【解决方案1】:

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

    p = (p * 4)/3
    

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

    p = p * (4/3)
    

    4/3在计算机上因为整数除法是1,所以第二个例子基本上是乘以1。

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

    【讨论】:

    • 如有疑问,请加括号!
    • 或者得到所有的 fortrany 并写 4./3double(4)/3 或任何其他各种强制使用浮点运算的咒语。
    • @Jonathon:括号在这里没有用,不是吗? p *= (4/3) 还是错的。
    • @TonyK,当然。我之所以这么说,是因为他的工作声明p = p * 4/3 可能存在歧义。 OP 对间距的使用令人难以置信的误导,因为我们知道,它的作用是 p = (p*4) / 3
    • @KeithThompson 是的,除了应该是 p *= 4.0 / 3.0
    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    相关资源
    最近更新 更多