2013-12-16 3 views
-1

Например, i++ можно написать как i=i+1. Аналогичным образом, как ++i быть записан в форму, как указано выше, для i++?Расширение оператора pre increment в языках программирования

Точно так же, как и i++, или если нет, укажите, пожалуйста, правильный способ написать ++i в форме, указанной выше для i++?

+1

Значение «i ++» и «++ i» может изменяться в зависимости от контекста, например. 'foo (i ++)' не совсем то же самое, что 'foo (++ i)'. – devnull

+2

О, мои дорогие теги .. –

+0

Это зависит от языков, так что укажите, на каком языке вы задаете свой вопрос. –

ответ

6

Вы на самом деле есть это неправильный путь вокруг:

i=i+1 ближе к ++i чем i++

Причина этого заключается в том, что она делает в любом случае только разницу с окружающими выражениями, как:

j=++i дает ямайских такое же значение, как и j=(i+=1)j=(i=i+1)


Там в целом гораздо больше к истории, хотя:

1) Для того, чтобы быть на той же земле, давайте посмотрим на разницу в преинкремента и постинкремента:

j=i++ против j=++i

Первый пост-инкремент (значение возвращается и «пост» = после этого увеличивается на единицу), чем позже один предварительно приращение (значение «до» = перед тем увеличивается, а затем возвращается)

Таким образом, (мульти заявление) эквиваленты будут: j=i; i=i+1; и i=i+1; j=i; соответственно

Это делает все это очень интересно с (теоретически) выражениями типа j=++i++ (которые являются незаконными в стандартном C, хотя, поскольку вы не можете менять одну переменную в одном выражении несколько раз)

Это также интересно в отношении заграждений памяти, поскольку современные процессоры могут выполнять так называемое выключение из строя, что означает, что вы можете записать код в конкретный порядок, и он может быть выполнен в совершенно ином порядке (tho Конечно, для этого есть определенные правила). Компиляторы могут также изменить порядок вашего кода, поэтому 2 заявления фактически заканчиваются тем же самым в конце.

-

2) В зависимости от компилятора, выражения, скорее всего, на самом деле же после компиляции/оптимизации и т.д.

Если у вас есть автономное выражение i++; и ++i; компилятор, скорее всего, преобразуйте его в промежуточную команду «ADD» asm. Вы можете попробовать это самостоятельно с большинством компиляторов, например. с gcc это -s, чтобы получить промежуточный выход asm.

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

for (int i = 0; i < whatever; i++)

, как непосредственно перевод i++ в этом случае может испортить дополнительный регистр (и возможные привести к регистрации разлива) и привести к невостребованной инструкции (мы говорим о вещах здесь, столь незначителен, что это на самом деле не имеет значения, если цикл не проходит триллион раза с одной инструкцией ассемблерной или тому подобным)

-

3) Вернуться к первоначальному вопросу, все это является старшинство вопрос, как 2 заявления могут быть выражены в виде (на этот раз немного более точным, чем верхнее объяснение):

something = i++ =>temp = i; i = i + 1; something = temp

и

something = ++i =>i = i + 1; something = i

(здесь вы также можете увидеть, почему первый вариант теоретически привести к более регистру пролит и больше инструкций)

Как вы можете видеть здесь, первое выражение не может быть легко изменено так, как я думаю, удовлетворит ваш вопрос, поскольку его невозможно выразить с использованием символов приоритета, например. скобки или, проще понять, блок). Для второго, хотя, это легко:

++i =>(++i) =>{ i = i + 1; return i } (псевдокод)

для первого, который будет

i++ =>{ return i; i = i + 1 } (псевдо-код еще раз)

Как вы можете видеть, это не сработает.


Надеюсь, что я помог вам прояснить ваш вопрос, если что-нибудь, возможно, потребуется уточнение или я сделал ошибку, не стесняйтесь указать на это.

1

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

Этот результат также идентичен i += 1 и i = i + 1.

Разница только приходит, если вы начнете использовать ++i и i++ внутри большего выражения.

-1

++ i будет увеличивать значение «i», а затем возвращать добавочное значение. Пример:

int i=1; 
System.out.print(++i); 
//2 
System.out.print(i); 
//2 

я ++ увеличит значение «я», но возвращает исходное значение, что «я» проводится перед тем, как увеличивается.

+1

Я уверен, вы имели в виду «i ++» во втором фрагменте кода. – anishsane

+0

Конечно, спасибо;) – gabriel

+0

Я думаю, что ваш ответ вводит в заблуждение, потому что после выполнения инструкции (т.е. когда программа находится в комментарии) значение 'i' равно 2 независимо от того, используете ли вы' i ++ 'или' ++ i'. Разница заключается только в том, что вы используете этот оператор при доступе, например. массив, в котором 'arr [i ++]' и 'arr [++ i]' не возвращает тот же самый элемент. – mvieghofer

1

Настоящий смысл этого до и после приращения, вы будете знать только о том, где вы используете это.?

Основное отличие заключается в

предварительно условие будет увеличиваться, прежде чем выполнять какие-либо заявления. Состояние сообщения будет увеличиваться после выполнения инструкции.

Здесь я упомянул простой пример для вас.

void main() 
{ 
    int i=0, value; 

    value=i++; // Here I've used post increment. Here value of i will be assigned first then It'll be incremented. 

// After this statement, now Value will hold the value 0 and i will hold the value 1 

// Now I'm going to use pre increment 

value=++i; // Here i've used pre increment. So i will be incremented first then value will be assigned to value. 

// After this statement, Now value will hold the value 2 and i will hold the value 2 


} 
2

Технически j = ++i такая же, как

j = (i = i + 1); 

и j = i++; такое же, как

j = i; 
i = i + 1; 

Вы можете избежать написания этого, как две строки с этой уловкой, хотя ++ Безразлично» сделайте это.

j = (i = i + 1) - 1; 
0

Для i++ нет эквивалента.

В i++ значение для i увеличивается после оценки окружающего выражения.
В ++i и i+1 значение для i увеличивается до вычисления окружающего выражения.

1

Это может быть сделано с помощью анонимных методов:

int i = 5; 
int j = i++; 

эквивалентно:

int i = 5; 
int j = new Func<int>(() => { int temp = i; i = i + 1; return temp; })(); 

Однако, было бы больше смысла, если бы он был расширен в качестве имени метода с параметром ref (который имитирует базовую реализацию оператора i++):

static void Main(string[] args) 
{ 
    int i = 5; 
    int j = PostIncrement(ref i); 
} 

static int PostIncrement(ref int x) 
{ 
    int temp = x; 
    x = x + 1; 
    return temp; 
} 
Смежные вопросы