【问题标题】:C++ : error with total+= in a while loopC ++:在while循环中出现total + =错误
【发布时间】:2018-09-23 00:45:48
【问题描述】:

我是编程新手,目前正在阅读“C++ Primer Plus”一书。这是我为某个章节所做的整个练习。这段代码的结果不是我想象的那样(我预计 total 只会将捐赠 [1] 的值添加到捐赠 [9])。

#include <iostream>


using namespace std;

int main()
{   double total;
    int bigger=0;
        int values=0;
    double donation[10];

    cout<<"Enter 10 donation values(numbers only). ";
    cout<<"Enter first value: ";

    while (values<10 && cin>>donation[values] )
    {   ++values;
        if (values<10)
        {
        cout<<"Enter value no " <<(values+1)<<" :";
        total+=donation[values];
    }
    }
    double average=total/10;

    for ( values=0; values<10; values++)
    {
    if (donation[values]> average)
    {
        bigger++;
    }

    }
    cout<<"The average of the numbers is: "<<average<<endl;
    cout<< bigger <<" numbers larger than average. \n";
    cout<<"Bye";



    return 0;
}

这是我运行程序时得到的示例:

Enter 10 donation values(numbers only). Enter first value: 1
Enter value no 2 :2
Enter value no 3 :3
Enter value no 4 :4
Enter value no 5 :5
Enter value no 6 :6
Enter value no 7 :7
Enter value no 8 :8
Enter value no 9 :9
Enter value no 10 :10
The average of the numbers is: 6.15278e-311
10 numbers larger than average. 
Bye 

【问题讨论】:

  • “这段代码的结果不是我所期望的”结果是什么,你期望什么?向我们提供您输入的值以及您期望输出的值与实际发生的情况。
  • total 的初始值是多少?使用未初始化的变量是UB,但无论如何你都应该提供minimal reproducible example
  • 创建时将total设置为0。
  • 我编辑了问题并包含了一个示例输出

标签: c++ arrays if-statement while-loop increment


【解决方案1】:

我可以在您的代码中看到几个错误。

首先,正如Pete Becker 指出的(和Lightness Races in Orbit 精炼的),total 没有初始化,所以它的值是不确定的。它甚至可能是浮点数的无效表示(例如 NaN ),并且它不能确定是您计算的有效起点。

提高编译器的警告级别会帮助您发现此错误。例如,使用命令行参数-Wall -Wextra,clang++ 输出如下:

...警告:在此处使用时变量“总计”未初始化 [-Wuninitialized] 总计+=捐赠[价值]; ^~~~~ prog.cc:7:17:注意:初始化变量“total”以消除此警告 {双总; ^ = 0.0 生成 1 个警告。

因此,按照他们的建议,您可以将其声明为:

double total = 0.0;

或者在计算之前重置它的值。

其次,你的输入循环不正确:

while (values < 10  &&  cin >> donation[values] )
{   
    ++values;            // <- Why is it here?
    if (values < 10)
    {
        cout << "Enter value no " << (values+1) <<" :";
        total += donation[values];    // <- Is this executed for the last (9) index? 
    }
}

你可以这样改写:

while ( values < 10 )
{
    cout << "Enter value no " << (values+1) <<" :";
    cin >> donation[values];
    if ( !cin ) // <- Input error, deal with it, somehow
        break; 
    total += donation[values];  
    ++values;
}

【讨论】:

  • 其实total不能有任何值。字面上地。它不能具有已知值。该值为不确定。如果您从中读取并得到一些看起来有点像数字的东西,那只是 UB 产生的纯粹机会。
  • @LightnessRacesinOrbit 感谢您指出这一点。抱歉措辞不佳。
  • 只是挑剔!觉得你的回答很棒。
猜你喜欢
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2014-08-27
  • 2011-07-10
相关资源
最近更新 更多