2015-11-22 5 views
2

С давних времен я узнал, что ++ означает постепенное добавление к значению целого числа. if ++ var сначала добавит его, а затем присваивает его значению, а если var ++ добавит его позже.++ операнд не работает, если var = var ++;

Вот мой вопрос:

int step=0; 
if(conditon==true){ 
    while(!end){ 
     step=step++; 
    } 
} 
    System.out.println(step); 

Выход этой небольшой кусок кода будет равна нулю. Но если я заменил step=step++; на step=++step;, тогда он даст правильный ответ.

Однако я смущен, почему есть разница?

EDIT

Разница с сосланного Ответ: Есть 2 (или даже 3) различные переменные, которые назначены друг с другом в то время как здесь шаг = шаг ++ приведет к 0. На основании ответов в том, что вопрос, будет другим. но это не так. Зачем?

Вот ответ на этот вопрос:

int x = 0; 
int y = 0; 
y = ++x;   // result: y=1, x=1 

int x = 0; 
int y = 0; 
y = x++;   // result: y=0, x=1 

Acoording этому step=step++ следует добавить до step (потому что оба х и у здесь же переменную, которая является шагом), но это не так.

EDIT 2

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

+1

В частности, этот [ответ] (http://stackoverflow.com/a/12111301/794242) объяснит детали –

+0

@WandMaker нет, это не так. в этих ответах есть две разные переменные, которые назначаются друг другу, а здесь «step = step ++» будет равен 0. На основании ответов в этом вопросе это будет другим. но это не так. Зачем? – lonesome

+1

Перечитайте внимательно объяснение, в котором байт-код (и, следовательно, в псевдо-Java-коде) y = y ++ будет переведен в. Поэтому у вас есть порядок инструкций и четкое объяснение полученных результатов. – benzonico

ответ

1

я полосатые из вашего состояния в простой следующий код:

int step=0; 
    step=step++;   
    System.out.println(step); // will give 0 

Причина этого дает 0, как выход, так как увеличивается значение никогда не назначается step.

для step=step++; это то, что происходит

int temp = 0; 
step = temp; // step will get 0 
temp = temp +1; // while temp is incremented 

в случае ++step вышеуказанных изменений в

int temp =0 ; 
temp = temp + 1; // temp gets incremented 
step =temp; // step gets the incremented value 
+0

Как насчет 'step ++'? Я имею в виду только «step ++», и результат будет таким же, как «step = ++ step». Мой вопрос: ** Почему? **. – lonesome

+0

@lonesome Я предоставил оба случая – Ramanlfc

+0

@lonesome для простого шага ++, приращение значения 'temp' будет присвоено' step', но если вы напишете 'step = step ++;' значение будет присвоено до инкремента – Ramanlfc

2

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

step = step++ шаг шагает, а затем присваивает значение без приращения для шага.

step = ++step шаг шагает, а затем присваивает добавочное значение шагу.

Таким образом, step = step++ увеличивает шаг, а затем возвращает его к исходному значению, что делает утверждение, похоже, не имеет эффекта.

+0

Что вы имеете в виду, когда говорите 'оценивается поинтенсивному значению' и' оценивает значение без приращения '? – lonesome

+0

@lonesome Если шаг был равен 1, то после его прироста инкрементное значение равно 2, а значение без инкремента равно 1. Это значение, которое используется, когда вы назначаете его или используете его в выражении. – fgb

1

Разница в поведении обусловлена ​​поведением двух разных операторов, которые вы используете. ++ перед переменной является оператором префикса и ++ после того, как переменная является оператором постфикса. Два разных оператора изменяют переменную в два разных раза во время оценки выражения. Смотрите эту StackOverflow What is the difference between prefix and postfix operators?

Когда вы делаете назначение, операции на правой стороне оператора присваивания (знак равенства или =) оцениваются и результат помещается в переменную слева от оператора присваивания.

Операции с правой стороны оцениваются или вычисляются с использованием различных правил приоритета оператора. См. Этот stackoverflow Operator precedence in Java.

Итак, вопрос заключается в оценке правой стороны, что является результатом различных операций, которые находятся в правой части оператора присваивания.

Оба префикса и постфиксные операторы имеют почти самый высокий приоритет оператора в Java, а также большинство языков. Это означает, что, если скобки не используются для изменения последовательности оценки, операторы префикса и постфикса будут одним из первых оцениваемых операторов. См. Java Operator Precedence Table для краткой и простой таблицы чит-листа.

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

Другими словами, значение переменной, используемой в выражении, будет измененным значением с префиксом и неизменным значением с помощью постфиксного оператора.

Это легче увидеть, что происходит с помощью двух переменных, а не один:

int a, b; 

a=0; 
b = ++a; // increment a and assign the new value of variable a to variable b 
b = a++; // increment a and assign the old value of variable a to variable b 

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

С префиксным оператором правая часть вычисляет новое, увеличивающееся значение переменной a. С помощью постфиксного оператора правая часть вычисляет старое значение переменной a до того, как она будет увеличена оператором постфикса.

Часто, когда желание просто увеличивать переменную, префикс или постфикс ++ используется в отдельной заявке.

int a = 0; 

a = a + 1; // increment a by adding 1 to the value and assigning new value to a 
a += 1; // increment a by using += operator 
a++; // increment a by using postfix ++ operator 
++a; // increment a by using the prefix ++ operator 

В заявлениях выше, где оператор ++ используется ничего не делается с результатом операции. Таким образом, переменная a увеличивается, однако старое значение a от оператора postfix или новое значение a от префиксного оператора не используются ни для чего. Единственным результатом использования этих операторов является то, что переменная a увеличивается.

Другими словами, если используется префикс или постфиксный оператор, на самом деле есть два результата или результаты от оператора. Первый результат - изменение переменной, которая изменяется оператором, также известный как побочный эффект. Второй результат - это значение, которое предоставляется любым другим операторам, которые могут участвовать в вычислении. В случае префиксного оператора этот второй результат - новое значение переменной после применения префиксного оператора. В случае постфиксного оператора этот второй результат - это старое значение переменной до применения оператора postfix.

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