2014-01-30 4 views
1

Я начинаю на C++. Я понимаю, что: -Приращение ++ i, i ++ и i + = 1

i ++ выполняется в первую очередь, затем increment, ++ i сначала увеличивается, а затем выполняет, i + = 1 увеличивается на 1, а затем выполняет. Но в цикле FOR:

for (i=0;i<10;i++) 
for (i=0;i<10;++i) 

В этих двух циклах на самом деле нет никакой разницы.

Вот еще один, чтобы вычислить сумму всех целых чисел от 1 до 100:

int i=1, sum=0; 
while (i<=100) 
{ 
    sum+=i; 
    i++;   //i+=1; ++i; 
} 
cout<<sum<<" "<<i<<endl; 
return 0; 

Но если я заменю я ++ с I + = 1 или ++ я, все они возвращают сумму 5050 и я из 101. Так что я действительно не вижу в них никакой разницы.

Так может кто-нибудь объяснить это мне? Какой из них больше всего используется в программировании? Спасибо!!

+3

«i ++ выполняется в первую очередь, затем increment, ++ i - это инкремент сначала, а затем выполнение, i + = 1 - увеличение на 1, а затем выполнение» - опасно неправильно. 'i ++' is "increment и оценивать исходное значение"; нет описания того, что происходит «первым». – user2357112

+0

@ user2357112 Действительно, за исключением случаев, когда эти операторы перегружены, так как 'operator ++' должен возвращаться до того, как выражение можно считать оцененным. Вот почему часто требуется предварительное увеличение/уменьшение - нет необходимости создавать копию исходного объекта. – bcrist

ответ

1

Я думаю, если вы представляете, как работает цикл for, вы можете понять проблему.

цикл

initialization --> i = 0 

<check condition> --> i<10? ------->-------------------- 
|      |        | 
^      |yes(i.e condition not met)  |no(i.e condition met) 
|      V        V 
|     -------------- 
|     |body of loop| 
|     -------------- 
|      | 
|      V 
-------<------------increment i (**)    exit for loop 

** increment i означает i++ или ++i

i++ можно заменить следующим образом:

int temp = i; 
i = i + 1; 

temp будет бесполезно здесь, так что компилятор будет оптимизировать его просто inc i инструкция. даже если это не делает, что temp - всего лишь пустая трата пространства, и все.

++ я может быть заменен

i = i + 1; 
int temp = i; 

снова температуры не требуется, так что компилятор просто заменить его inc i инструкцией.

Если вы видите, что обе эти инструкции одинаковы, поскольку они не присвоены ни одному. только i влияет на приращение. поэтому оба они по существу одинаковы. это верно, если i - это встроенный тип.

вы видите, что инструкция инкремента помещается после тела цикла? можете ли вы теперь увидеть, что это почти похоже на цикл while, который вы показали?

всегда приятно думать о циклах таким образом.

2

Ваш анализ правилен. i++ вернет значение i, затем увеличится, тогда как ++i увеличит значение i, а затем вернет новое значение. i += 1 будет делать то же самое, что и ++i. Разница в том, где они будут использоваться в реальном коде, в первую очередь ситуативна; нет конкретного ответа, где каждый из них чаще всего используется или полезен. Все зависит от того, что вы хотите сделать.

Вот надуманный пример один раз это может быть полезно использовать пост-инкремент (i++ форма):

// Return the length of a string, including the null byte 
int stringLength(char str[]) 
{ 
    int length = 0; 
    while (str[length++] != 0); 
    return length; 
} 

Если вы хотите, чтобы вернуть длину без нулевого байта, вы можете изменить приведенный выше пример немного, используя ++i форму:

// Return the length of a string, without the null byte 
int stringLength(char str[]) 
{ 
    int length = -1; 
    while (str[++length] != 0); 
    return length; 
} 

что касается i += 1, я не думаю, что я когда-либо делал совсем, что, так как вы можете использовать до или после приращения вместо этого. Я обычно использовал только операторы комбинированного присваивания для значений, отличных от 1.

4

Так может ли кто-нибудь объяснить это мне?

Что i++ делает возвращает текущее значение i, а затем увеличить его на единицу, а ++i первый прирост i по 1, а затем возвращает значение i.

Взгляните на это, например:

i = 5; 
j = 5; 
res = i++; //res = 5, but i=6 
res = ++j; //res = 6 and j=6 

Какой из них является наиболее часто используемым в программировании?

Оба используются в зависимости от того, что вы хотите или как хотите. более


Одно замечание: ++i является л-значение, но i++ нет.Подробнее см. here

+0

К первому вопросу, на который вы отвечаете «Это объяснение различия между i ++ и ++ i», но вы не предоставляете никаких * объяснений *. Вы в порядке, сэр? – Shoe

+0

Я пытался объяснить кодом, что-то не так? – deeiip

+0

Вы просто показываете какой-то код, не объясняя это или не отвечая на любой вопрос. Хотя объяснение кода может быть очевидно для вас, это не те, кто его читает. – Shoe

6

Вы верны. В ваших примерах нет разницы.

Но здесь есть:

int i = 0; 
cout << i++ << endl; //prints 0 
cout << i << endl; //prints 1 

против

int i = 0; 
cout << ++i << endl; //prints 1 
cout << i << endl; //prints 1 

Какой из них является наиболее часто используемым в программировании?

Большую часть времени, ++ является единственной операцией в заявлении (FYI, for цикл имеет три заявления).

Если это не так, это может иметь значение, и вы будете использовать то, что дает вам правильное поведение.

FYI

Некоторые разработчики имеют мнение, что если до и постфикса операторы всегда должны быть использованы по отдельности (не является частью большого заявления). Они могут привести к запутыванию кода или даже к неопределенному поведению.

Например,

int i = 0; 
cout << i++ + i++ << endl; 

имеет неопределенное поведение.

+0

Я думаю, что это поможет OP, если вы разделите 'for loop' и покажете ему, как это можно себе представить. что даст прочную основу. –

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