Цель C, разница между n ++ и ++ n - PullRequest
2 голосов
/ 23 июня 2011

В Objective-C, есть ли разница между n ++ и ++ n (например, используется в цикле for)?

Ответы [ 6 ]

16 голосов
/ 23 июня 2011

++n; увеличивает значение n перед выражением.

n++; увеличивает значение n после выражения

Поэтому сравните результаты этого

int n = 41;
int o = ++n; //n = 42, o = 42

с результатами этого:

int n = 41;
int o = n++; //n = 42, o = 41

В случае циклов:

for (int i = 0; i < j; i++) {/*...*/}

однако это не имеет никакого значения, если у вас не было чего-то вроде этого:

for (int i = 0; i < j; x = i++) {/*...*/}

или этого:

for (int i = 0; i < j; x = ++i) {/*...*/}

Можно сказать:

Не имеет значения, использовать ли n++ или ++n, пока вторая (связанная) переменная не изменена (основана на n) в пределах того же выражения.


Те же правила применяются к --n; и n--;, очевидно.

3 голосов
/ 23 июня 2011

++ n увеличивает значение до его использования (преинкремент) и n ++ увеличивает после (постинкремент).

В контексте цикла for заметного различия нет, поскольку приращение применяется после выполнения кода в цикле.

2 голосов
/ 23 июня 2011

++n и n++ отличаются тем, что выражает выражение.Пример:

int n = 0;
NSLog(@"%d", n);   // 0
NSLog(@"%d", n++); // still 0, increments afterwards
NSLog(@"%d", n);   // 1
NSLog(@"%d", ++n); // 2, because it increments first
NSLog(@"%d", n);   // 2
0 голосов
/ 08 ноября 2018

Как указано выше,
- n уменьшает значение n до вычисления выражения.

n -; уменьшает значение n после вычисления выражения.

Следует отметить, что при использовании циклов while

Например:

n = 5
while(n--) #Runs the loop 5 times
while(--n) #Runs the loop 4 times

Как и в n-- цикл выполняется дополнительное время, пока n = 1 Но в --n 1 сначала уменьшается до 0, а затем оценивается. Это приводит к разрыву цикла while.

0 голосов
/ 23 июня 2011

В книге Скотта Мейерса «Более эффективный C ++» он приводит очень рациональный аргумент в пользу предпочтения увеличения префикса увеличению постфикса. Короче говоря, на этом языке из-за перегрузки операторов оператор приращения префикса почти всегда быстрее. Objective C не поддерживает перегруженные операторы, но если у вас есть или когда-либо будет выполняться какое-либо программирование на C ++ или Objective-C ++, тогда предпочтение отдается приращению префикса.

Помните, что в большинстве случаев ++ n выглядит так:

n = n + 1
[do something with n]

Тогда как n ++ выглядит (если используется по назначению):

register A = n;  // copy n
[do something with n]
n = A + 1;

Как вы можете видеть, в случае с постфиксом есть больше инструкций. В простых циклах for большинство компиляторов достаточно умны, чтобы избежать копирования, если очевидно, что преинкремент n не будет использоваться, но этот случай превращается в префиксный.

Надеюсь, это имеет смысл. Таким образом, вы должны использовать префикс, если вы действительно не хотите, чтобы «побочный эффект» оценивал, а затем увеличивал, что вы получаете от постфиксной версии.

0 голосов
/ 23 июня 2011

В цикле это не будет иметь значения. Некоторые люди говорят, что ++n быстрее, чем

...