【问题标题】:Strange result of displaying array using increment/decrement operator in C++在 C++ 中使用递增/递减运算符显示数组的奇怪结果
【发布时间】:2017-05-05 08:01:53
【问题描述】:
#include <iostream>

using namespace std;

int main()
{
    double donation[10];
    int index = 0;

    cout.setf(ios::fixed);

    cout << "Enter sum of money for donating: ";

    while (index < 10 && cin >> donation[index])
    {
        cout << "donation #" << 1 + index++ << ": " << donation[index] << endl;
    }

    return 0;
}

Result

该代码无法显示正确的捐赠价值...

我可以检查错误是'1 + index++',但我不知道为什么。

为什么我使用 '1 + index++' 的代码与我在下一行使用 'index++' 时的代码不同。

【问题讨论】:

  • 这篇文章中1 + index++的目的是什么?你为什么不简单地使用1 + index?您的代码现在的方式,index 在每次迭代中增加两次,这是问题之一。我的建议是只使用 ++ 作为单独的语句,除非您完全确定自己在做什么。
  • 对不起。我的错。我修改了代码。问题是下一行是否没有'index++'。
  • 您希望显示什么?您的代码对我来说似乎运行良好 - 它要求捐赠,然后立即显示它
  • 当我运行该代码时,它会显示一个与输入值不同的奇怪值,就像我添加的图片一样。
  • 请确保您在此处发布的代码确实会产生同样的问题。可以肯定的是,它与您用于在图像中生成输出的代码不同!也许你错过了更细微的差异

标签: c++ arrays increment


【解决方案1】:

保持惯用的方式,而不是试图理解陌生的结构,也应避免将增量与函数/运算符参数混合(参见sequence points):

for (int index = 0; index < 10; ++index)
{
   if (! std::cin >> donation[index])
        break;
   std::cout << "donation #" << (1 + index) << ": " << donation[index] << std::endl;
}

这应该符合预期,并且应该通过一些 C++ 知识来理解。它最多运行 10 次,尝试将输入填充到数组中,并在输入工作时显示或在输入失败时停止显示。唯一的问题是更好地验证用户输入。

【讨论】:

  • 感谢您的回答。但我想知道为什么我使用 '1 + index++' 的代码与我在下一行使用 'index++' 时的代码有所不同。
  • 查看答案中的序列点链接或stackoverflow.com/questions/3986361/… 以了解在其他构造中使用增量的作用以及它为何会导致意外结果。您正在更改索引并在 std::cout 语句中读取它。
  • 但是,将循环和输入处理分开可以使代码更清晰,并使实际输入验证更容易。
  • 哦,谢谢你给了我想要的答案。你给我的链接有帮助。我没有很好地理解副作用和序列点是错误的。感谢您的回答,我更好地理解了这个概念。
  • 链接帮助很大。我想把重点放在避免这些事情上,但确实有助于理解要避免什么以及为什么要避免。
猜你喜欢
  • 2015-10-03
  • 1970-01-01
  • 2011-02-16
  • 2011-08-29
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多