2017-02-17 60 views
-6

我是一名试图了解循环如何工作的初学者。我正在尝试使用下面的代码来查找数组中最大元素的值。它只运行了4次迭代,尽管我已经设置了n值=数组的大小= 5。因此,它没有测试最后一个元素的if条件,不知道为什么?好心提醒。无法理解循环迭代

int main() 
{ 
    int a[] = {1,2,3,4,5}; 
    int* max; 
    int i, n; 

    n = sizeof(a)/sizeof(a[0]); 
    max = a; 
    for(i=0; i<n; i++) 
    { 
     if(a[i] > *max) 
     { 
      *max = a[i]; 
      i++; 
     }  
    } 
    cout << "Maximum element in the array is : " << *max << endl;  
} 

O/P: - 数组中的最大元素是:4

+1

你在哪里声明了a,n和max?这段代码看起来很腥...... –

+0

刚刚更新了它。 – Aisha

+0

当您执行'* max = a [i]'时,您正在更改数组中的值,因为max指向数组中的值。 – stark

回答

0

你的代码的增量i的两倍,因此它不看的每一个元素。摆脱if内部的i++;。每个循环已经增加了一次,这就是你想要的。

0

为什么你在循环内部增加i?会发生什么情况是,每次输入if时,下一个元素将被跳过,因为您将增加i两次(一次循环增量,一次增加i++)。

0

您在if循环中增加了i,这会导致您跳过当前元素之后的元素。

删除i++;行,你应该没问题。

作为参考,如果你在for循环结束印刷i, *max你会得到:

  • 1,1(1 == 1所以内如果​​跳过)
  • 3,2
  • 5 ,4

请注意,您从来没有真正看过3或5,因为双增量会导致您忽略它们。

1

这是'新'C风格的代码,你应该更喜欢用这种方式编写for循环,它会自动遍历所有的值,所以你不必担心索引,所以它比C++更安全你可以通过数组并具有undefined行为 auto'变量'将自动检测你想要使用的类型,在这种情况下,编译器使用auto作为int。 一些reading关于汽车和环

#include <iostream> 

using namespace std; 

int main() 
{ 
    int arr[]{ 1,2,3,4,5 }; 
    auto max = INT_MIN; 

    for (auto const &val : arr) 
    { 
    if (val > max) 
     max = val; 
    } 

    cout << "The max value is: " << max << endl; 

    return 0; 
} 
+0

'(auto val:arr)'应该是'(auto&val:arr)'没有理由复制 – user463035818

+0

@ tobi303也没有理由不把它引用为''constst'。我猜想通过值或引用来传递内置类型是非常有趣的事情,在非泛型代码中。 @Seb'INT_MIN'和使用的数组类型可能更像C++一样。如果你使用'namespace std;'转储''也许''std :: max'在循环中。 – LogicStuff

+0

@LogicStuff你是对的,我只是想,如果一个人告诉别人他们应该如何编写代码,需要精确。我至少应该提及'auto&',因为一般来说,当我看到“我是初学者”时,它会产生变化 – user463035818

-1

你有两个增量I; 当您需要将指针的地址更改为新值时,您已将指针的值更改为当前值;

enter image description here