当我没有输出特定变量时,结果很奇怪

时间:2016-02-14 21:55:19

标签: c++

我试图编写一个程序,以便从用户那里获得5个数字并输出第二个数字。

正如你所看到的,我调用一个函数来搜索max,然后我将每个等量设置为-999以在下一次搜索中省略它们,最后我们再次搜索剩余数字之间的最大数量。这将是第二大数字。

问题是,如果我不输出"最大值"变量(我称之为"第一个最大值"),然后最终输出为零!无论输入是什么!

我不知道为什么以及如何连接它们,但我们在这里!

#include <iostream>
using namespace std;
#include <conio.h>

int searching (int arrays [])
{
   int max = 0;

    for ( int i ; i < 5 ; i++ )
        if ( arrays [i] > max )
            max = arrays [i] ;

return max;
}

int main ()  {

   int maximum;

   int numbers [5];

    for ( int i = 0 ; i < 5 ; i++ )                              
        cin >> numbers [i];

    maximum = searching (numbers);  

    cout << "First max : " << maximum << endl;

    for ( int i ; i < 5 ; i++ )                                 
       if ( maximum == numbers [i] )
          numbers [i] = -999 ;


     cout <<  "Second max : " << searching (numbers);

     getch();
     return 0;

}

现在,如果我省略以下行,最终答案将为零:|

cout << "First max : " << maximum << endl;

令人困惑:|

(注意:我也非常感谢如何改进代码,无论如何都要感谢阅读。)

2 个答案:

答案 0 :(得分:3)

你这样做了两次:

for ( int i ; i < 5 ; i++ )
//    ^^^^^

您的i未初始化。它可能不会从0开始。因此,您可以轻松地读取/写入不存在的数组元素。

这给你的程序未定义的行为 - 你违反了语言的合同和编译器的活动 - 无论是使用语言定义的合同执行优化,还是就一般的编译程序而言 - 已经导致你认为是一种奇怪的行为模式。

一般来说,这种模式 - 输入根据您是否在某个地方有std::cout而神奇地改变 - 几乎总是表示未定义的行为。当你看到它时,检查你是否没有在某个地方溢出缓冲区或者读取未初始化的变量(包括验证你没有在没有任何错误检查的情况下输入用户输入失败)。

答案 1 :(得分:0)

实现这一目标的一种更简洁的方法是跟踪两个值:到目前为止看到的最大值,以及迄今为止看到的第二大值。当您完成循环时,如果arrays[i]大于max,请将max复制到second_largest,然后将arrays[i]复制到max;否则,如果arrays[i]大于second_largest,请将arrays[i]复制到second_largest