c ++ простая сумма для цикла for - PullRequest
1 голос
/ 09 августа 2011

Я использую g ++ (GCC) 4.6.0, и у меня возникают проблемы с получением правильного результата.учитывая следующий простой цикл for в c ++

  void sum(){
  int sum;
  for(int i=0,sum=0;i<=10;sum+=i,++i);
  cout << sum << endl;
  }

, вывод дает мне 0. Предположим, в цикле for я добавил

  cout << sum << endl;

, что дает мне 0,1,3 ..до самой последней строки 0;

Я думаю, что причина, по которой я получаю 0, заключается в том, что в цикле for происходит затенение переменных?поэтому я попытался :: сумма, как в :: сумма = 0, и :: сумма + = я.но это жалуется компилятором.Также я попытался

  for(sum=0,int i=0;i<=10;sum+=i,++i); 

компилятор также жалуется на отсутствие первичного выражения в первом предложении в цикле for

Ответы [ 6 ]

8 голосов
/ 09 августа 2011

Действительно, у вас есть , чтобы использовать идентификатор sum три раза для трех разных вещей? : -S

Просто напишите это читабельно:

int sum = 0;
for(int i = 0; i <= 10; ++i) { sum += i; }

Больше нет путаницы, нет теней, нет неинициализированных переменных. Кого ты пытаешься обмануть? Подумайте о своей замене, которой придется выучить и понять ваш код!

Подсказка: включите предупреждения компилятора!

PS: Прежде чем кто-либо расскажет об эффективности и начнет считать циклы ЦП: а) не надо. б) обними свою жену. в) сравните сборку этого кода с вашим кодом.

6 голосов
/ 09 августа 2011

int i=0,sum=0 равно , а не так же, как int i=0; sum=0;. Это один оператор, который объявляет две переменные.

Это означает, что вы следите за внешним sum:

void sum() {
  int sum; // <-- one `sum`
  for (int i=0,sum=0;i<=10;sum+=i,++i) {} // <-- second `sum`
  cout << sum << endl;
}

Только первый оператор объявления может быть в первом предложении преамбулы for (подумайте, будет ли sum=0,int i=0 допустимым в другом месте вашего кода), но вы можете обойти эту проблему, вытаскивая "инициализация" до 0 полностью :

void sum() {
   int sum = 0;
   for (int i = 0; i <= 10; sum += i, ++i) {}
   cout << sum << endl;
}

Или , чтобы он действительно читался :

void sum() {
   int sum = 0;
   for (int i = 0; i <= 10; i++) {
      sum += i;
   }
   cout << sum << endl;
}
4 голосов
/ 09 августа 2011

Измените ваш код на:

 void sum(){
  int sum = 0;
  for(int i=0;i<=10;sum+=i,++i); // all work is in for loop
  cout << sum << endl;
 }

Некоторые (старые) компиляторы не разрешат ваш исходный код, потому что вы определили второй sum внутри цикла for, который скрывал исходный.Таким образом, он правильно накапливал в цикле for, но sum, определенный вне цикла for, остался нетронутым.Для более подробной информации:

int i = 0, sum = 0;

совпадает с:

int i = 0;
int sum = 0;
3 голосов
/ 09 августа 2011

У вас есть две разные sum переменные.Один объявлен в строке

int sum;

, а другой объявлен в объявлении инициализации вашего цикла for.

Первая часть оператора for равна либо единственное объявление или выражение.В последнем случае выражение может состоять из нескольких присваиваний, разделенных запятыми, но вы не можете смешивать и сопоставлять объявления и выражения в одном цикле for.Таким образом, int i=0, sum=0 будет проанализирован как одно объявление , которое объявляет i и sum.Таким образом, в вашем цикле вы увеличиваете внутренний sum, но после цикла виден только один внешний , и он по-прежнему имеет значение мусора, с которого начинал.

(Кроме того, позор, что вы поместили мясо цикла в выражение обновления, а не в тело!)

0 голосов
/ 09 августа 2011

Почему вы положили ; после цикла for?Из-за этого у вас есть 10 итераций цикла без какого-либо вывода и, наконец, у вас есть результат - ноль.

0 голосов
/ 09 августа 2011

Вы правы.Решение состоит в том, чтобы сделать это следующим образом:

void sum(){
    int sum = 0;
    for(int i=0;i<=10;sum+=i,++i);
    cout << sum << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...