【问题标题】:c++ int changes into around 4198321 when I expect a 1 [duplicate]当我期望 1 [重复] 时,c++ int 变为 4198321 左右
【发布时间】:2017-07-26 11:30:23
【问题描述】:

我对 c++ 有点陌生,但在 python 和 c# 方面已经更深入了,我不记得发生过这样的事情。我试图计算一个数组中有多少个正数、负数和零,但计数会以某种方式跳到 4198321 左右,但它略有不同。那么为什么会发生这种情况以及导致它发生的原因是什么?我无法在网上找到任何答案。 代码:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main()
{
    long n, pos, neg, zer;
    cin >> n;
    vector<int> arr(n);
    for(int arr_i = 0;arr_i < n;arr_i++){
       cin >> arr[arr_i];
    }
    for(int i; i < n; i++)
    {
        if(arr[i] > 0)
        {
            pos++;
            cout << "pos now is: " << pos << endl;
        }
        else if(arr[i] < 0)
        {
            neg++;
            cout << "neg now is: " << pos << endl;
        }
        else if(arr[i] == 0)
        {
            zer++;
            cout << "zer now is: " << pos << endl;
        }
    }
    cout << "pos: " << pos << endl;
    cout << "neg: " << neg << endl;
    cout << "zer: " << zer << endl;

    return 0;
}

抱歉,如果我花了太长时间才说到重点,这是我提出的第一个问题。输出(如果需要)是:

neg now is: 4198320
pos now is: 4198321
neg now is: 4198321
zer now is: 4198321
pos now is: 4198322
pos now is: 4198323
pos: 4198323
neg: 4
zer: 1

【问题讨论】:

标签: c++ int


【解决方案1】:

您可以尝试的最简单的方法是在计数之前打印pos。那应该是零,但您实际上并没有将pos 设置为零。相反,你得到了一些随机值,无论之前那个内存位置是什么。

正式地说,这是Undefined Behavior,因此您可能会得到"lemon"

【讨论】:

  • 谢谢,我试过了,它奏效了。我不知道为什么我没有早点想到。
【解决方案2】:

for(int i; i &lt; n; i++)中,变量i没有初始化。

其余的是未定义的行为。

【讨论】:

  • 我不需要初始化 i,它的 for 循环相同
  • 仍然未定义的行为。我不会打赌它可以在每个平台上工作。事实上,我不会打赌即使在同一个平台上使用不同的项目设置也能工作。例如,尝试在发布模式而不是调试模式下构建和运行您的项目。调用dude可以忽略,但是变量在使用前需要初始化!!!
  • 明白。我会记住这一点,以备将来之用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2011-01-05
  • 1970-01-01
相关资源
最近更新 更多