Предотвратить риск при использовании постфиксного оператора декремента / приращения в C ++? - PullRequest
0 голосов
/ 26 апреля 2011

Недавно я обнаружил риск при использовании st следующим образом:

int i = 10;
int sum = 0;
while ( i-- ){
      sum = sum + i;

На самом деле получается сумма = 9 + 8 + 7 + .. + 1. Так что в общем не хватает 10.Но я предпочитаю такой способ кодирования, он быстрый и профессиональный.Есть какой-нибудь совет, чтобы предотвратить риск и все еще иметь краткий код?

Ответы [ 5 ]

5 голосов
/ 26 апреля 2011

У вас есть счетчик, условие останова и операция декремента, поэтому используйте цикл for - он гораздо лучше подходит, чем while:

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

"Professional", кратко и без риска:)

Редактировать: Или, если вы хотите быть действительно , кратко:

int sum = 55;
3 голосов
/ 26 апреля 2011

По крайней мере для этого конкретного типа серии (сумма от 1..N) вы можете просто сделать N*(N+1)/2. 10 * 11/2 = 55.

1 голос
/ 26 апреля 2011

Постфиксное увеличение / уменьшение может быть довольно неприятным. Я рекомендую не использовать его. Ваш пример даже не худший. Он ведет себя довольно хорошо: на самом деле вы получаете сумму = 9 + 8 + 7 + ... + 1 + 0; Таким образом, вы проходите цикл 10 раз, как можно подумать.

Как уже упоминалось в комментарии, используйте цикл for.

int sum=0;
for (int i=10;i;--i) sum+=i;

Префиксный оператор гораздо менее запутан, а в некоторых случаях делает код быстрее.

0 голосов
/ 26 апреля 2011

Понятия не имею, что вы подразумеваете под «риском» и «профессиональным» способом кодирования, этот код просто неверен. Если вы хотите, чтобы это выглядело «похоже» на то, что вы написали

int i = 10;
int sum = i;
while ( i-- ){
      sum = sum + i;

или

int i = 10;
int sum = 0;
do {
    sum += i;
} while (--i);
0 голосов
/ 26 апреля 2011

Используйте do-while вместо while.

...