为什么每次迭代都会为变量保持相同的值? C ++

时间:2017-07-26 07:51:50

标签: c++ variables

我是c ++的新手,我一直为变量获得相同的价值' w' ..

#include <iostream>
#include <string>

#define NOEXE 10
#define winit 0.9
#define wfinal 0.2

int main()
{
    for (int nExeNo = 0; nExeNo<NOEXE; nExeNo++)
    {
        double w;

        w = (((NOEXE - nExeNo)/NOEXE)*((NOEXE - nExeNo)/NOEXE))*(winit - wfinal) + wfinal;
        std::cout << w << "\n";
    }
}

,输出

0.9
0.2
0.2
0.2 .......

3 个答案:

答案 0 :(得分:1)

(NOEXE - nExeNo)/NOEXE完全用整数运算完成。由于nExeNo < NOEXE整个前一个表达式始终为零。

因此,您只剩下最后一个词wfinal

要强制浮点运算,至少有一个操作数必须是浮点类型(在您的情况下为double)。因此,要清理并摆脱讨厌的宏,请按如下方式定义常量:

constexpr int    NOEXE   = 10; // use const instead of constexpr for C++03
constexpr double NOEXE_D = NOEXE;
constexpr double winit   = 0.9;
constexpr double wfinal  = 0.2;

在计算中使用NOEXE_D代替。即(NOEXE_D - nExeNo)/NOEXE_D)

答案 1 :(得分:0)

这是因为NOEXEnExeNo是整数,所以使用它们的单独计算四舍五入到最接近的整数:NOEXE - nExeNo)/NOEXE将始终舍入到1或0。它将在第一次迭代时舍入为1,然后在所有进程中舍入为0.

如果您将NOEXE更改为浮动,则应该

#define NOEXE 10.0

结果如下

0.9
0.767
0.648
0.543
0.452
0.375
0.312
0.263
0.228
0.207

通常,最好定义类型并使用const而不是#define

答案 2 :(得分:0)

这是因为你正在进行整数除法,而不是像你想要的那样浮动

让我们关注循环中的(NOEXE - nExeNo)/NOEXE)部分

for (int nExeNo = 0; nExeNo<NOEXE; nExeNo++)
{
    double w;

    w = (((NOEXE - nExeNo)/NOEXE)
    std::cout << w << "\n";
}

您可以看到打印输出为

1
0
0
...

解决此问题的最快方法是将NOEXE定义为浮点

#define NOEXE 10.0

或将其中一个运算符强制转换为

w = (((NOEXE - nExeNo)/(double)NOEXE)*((NOEXE - nExeNo)/(double)NOEXE))*(winit - wfinal) + wfinal;