Цель C, разница между n++ и ++n



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

844   5  

5 ответов:

++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--;.

++n увеличивает значение до его использования (pre-increment) и N++ увеличивает после (post-increment).

В контексте цикла for нет заметной разницы, так как инкремент применяется после выполнения кода в цикле.

++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

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

В книге Скотта Мейерса "более эффективный 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 не будет использоваться, но этот случай переходит в префиксный случай.

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

    Ничего не найдено.

Добавить ответ:
Отменить.