2011-08-08 2 views
1

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

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

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

cout << sum << endl; 

это дает мне 0,1,3 ... до самого последняя строка 0;

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

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

компилятор также жалуется, не имеющие начальное выражение в первом предложении в цикл

+0

Пожалуйста, включите результаты, которые вы на самом деле ожидаете от этого. – pmr

+0

sum (0..10) = 11 * 10/2 = 55 – cplusnewbieeeee

+1

@Martin: Зачем отвечать в комментарии? Ответьте в ответ ... за исключением того, что уже сделали несколько человек. –

ответ

6

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 быть действительным в другом месте в вашем код), но вы можете обойти эту проблему pulling out the "initialisation" to 0 entirely:

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

Или, so that it's actually legible:

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

... упрощен и изменен результат пост-состояния ... – dalle

+0

@dalle: Если вы нажмете на ссылки, вы увидите, что я этого не сделал. –

+0

@dalle: В операторе запятой '[2003: 5.18/1]' говорит: «[..] Все побочные эффекты (1.9) левого выражения [..] выполняются ** перед ** оценкой правильное выражение ". (внимание мое) –

4

Изменить код:

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

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

int i = 0, sum = 0; 

так же, как:

int i = 0; 
int sum = 0; 
+0

Я знаю, что могу сделать sum = 0 вне цикла for. но я хочу воспользоваться преимущественной фазой цикла for. – cplusnewbieeeee

+2

@cplusnewbieeeee: Почему? Это не более эффективно для этого, ограничивает видимость суммы внутри цикла for и делает код менее читаемым (как справедливо указывает Kerrek SB). Меньше строк кода! = Лучший код. –

+0

Обратите внимание, что поведение gcc действительно соответствует стандарту. – pmr

8

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

Просто напишите его readbly:

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

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

Совет. Включите предупреждения компилятора!

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

+0

Это также отличный момент. –

3

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

int sum; 

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

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

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

0

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

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

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

Смежные вопросы