Почему компилятор пропускает цикл for? - PullRequest
1 голос
/ 24 октября 2019

Я попытался поработать с vector, и я сделал простой цикл for, чтобы вычислить сумму элементов в векторе. Программа работала не так, как я ожидаю, поэтому я пытаюсь запустить отладчик, и, к моему удивлению, компилятор как-то вообще пропускает цикл for, и я не нашел разумного объяснения.

//all code is written in cpp
#include <vector>
#include <iostream>
using namespace std;

int simplefunction(vector<int>vect)
{
   int size = vect.size();
   int sum = 0;
   for (int count = 0; count == 4; count++) //<<--this for loop is being skipped when I count==4
   {            
      sum = sum + vect[count];
   }
   return sum;  //<<---the return sum is 0 
}

int main()
{
   vector<int>myvector(10);
   for (int i = 0; i == 10; i++)
   {
      myvector.push_back(i);
   }
   int sum = simplefunction(myvector);
   cout << "the result of the sum is " << sum;    
   return 0;

}

Я провел некоторое исследование, и обычно неправильно определенный цикл for обнаруживается, когда не удается выполнить конечное условие (например, при установке count-- вместо count++)

1 Ответ

4 голосов
/ 24 октября 2019

Условия вашего цикла неверны, так как они всегда false!

Посмотрите на циклы там

for (int i = 0; i == 10; i++) 
//              ^^^^^^^-----> condition : is it `true` when i is 0 (NO!!)

и

for (int count=0; count==4; count++)
//                ^^^^^^^^^-----> condition : is it `true` when i is 0 (NO!!)

выпроверка i равна 10 и 4 соответственно, прежде чем увеличивать его. Это всегда false. Следовательно это не выполнило далее. Они должны быть

for (int i = 0; i < 10; i++) и for (int count=0; count<4; count++)


Во-вторых, vector<int> myvector(10); выделяет вектор целых чисел и инициализируется с помощью 0 с. Это означает, что цикл после этой строки (то есть в main())

for (int i = 0; i == 10; i++) {
    myvector.push_back(i);
}

вставит в нее еще 10 элементов (то есть i s), и вы получите myvector с 20 элементов. Вы, вероятно, намеревались сделать

std::vector<int> myvector;
myvector.reserve(10) // reserve memory to avoid unwanted reallocations
for (int i = 0; i < 10; i++) 
{
    myvector.push_back(i);
}

или проще, используя std::iota из заголовка <numeric>.

#include <numeric> // std::iota

std::vector<int> myvector(10);
std::iota(myvector.begin(), myvector.end(), 0);

В качестве примечания, избегайте практики с using namespace std;

...