powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / помогите восстановить порядок выполнения операций
25 сообщений из 25, страница 1 из 1
помогите восстановить порядок выполнения операций
    #38086109
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class Test {
    public static void main(String[] args) {
        int f;
        f = 5;
        f = ++f + f++;
        System.out.println(f);
    }
}



Осветите пожауйста тему сабжа

ответ 12.

мои мысли(они дают неправильный ответ):
сначала ++f итого f=6
потом f++ пока что f=6
затем сложение f=12
затем постинкремент вступает в силу f=13

Где я не прав?
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38086112
dexsu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90,

Считывание значения "12" произойдет раньше, чем установка значения "13" в переменной f.

Код: java
1.
2.
3.
int i=1;
System.out.println(i++);
System.out.println(i);



1
2
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38086845
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dexsu,

а что будет инкрементиться то? или инкремент вообще не произойдет?
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38086867
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://rsdn.ru/forum/java/4350417
/topic/973925
/topic/438962
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38086880
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подобны темы надо закрывать как дубли IMHO.
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087172
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
f = 5;
     f =  f++;
     System.out.println(f)



объясните, пожалуйста, почему тут результат 5. я чего то не понимаю, куда девается инкремент
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087196
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90
Код: java
1.
2.
3.
f = 5;
     f =  f++;
     System.out.println(f)


объясните, пожалуйста, почему тут результат 5. я чего то не понимаю, куда девается инкремент
1. присвоение выполняется после инкремента.
2. инкремент выполняется после считывания значения.

Поэтому: считали значение, выполнили инкремент, присвоили значение, которое считали.
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087199
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще поведение (пост/пред)инкрементов и присвоений - это language и compiller depends.

Можно также посмотреть какой код генерит Java. Но я еще не настолько крут
чтобы прокомментировать все операции.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
  Code:
   0:	iconst_5
   1:	istore_1
   2:	iinc	1, 1
   5:	iload_1
   6:	iload_1
   7:	iinc	1, 1
   10:	iadd
   11:	istore_1
   12:	getstatic	#2; //Field java/lang/System.out:Ljava/io/PrintStream;
   15:	iload_1
   16:	invokevirtual	#3; //Method java/io/PrintStream.println:(I)V
   19:	return
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087226
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВообще поведение (пост/пред)инкрементов и присвоений - это language и compiller depends.

Можно также посмотреть какой код генерит Java. Но я еще не настолько крут
чтобы прокомментировать все операции.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
  Code:
   0:	iconst_5  --- кладем на стек 5
   1:	istore_1 ----- берем верхний элемент стека(5), и сохраняем в локальную переменную под индексом 1(предполагаю что 0 - это this), теперь f =5
   2:	iinc	1, 1 ---- инкрементируем локальную переменную под индексом 1(f) на 1 - теперь  f =6
   5:	iload_1------- кладем значение локальной переменной под индексом 1 на верх стека
   6:	iload_1------- кладем значение локальной переменной под индексом 1 на верх стека, теперь на стеке 6, 6(btw почему не dup???)
   7:	iinc	1, 1 ------ инкрементируем локальную переменную под индексом 1(f) на 1 - теперь  f =7
   10:	iadd ----- слаживаем два верхних элемента стека(6+6), результат(12) ложим наверх стека - теперь там только 12
   11:	istore_1 ----- ложим верхний элемент стека в первую локальную переменную f = 12
   12:	getstatic	#2; //Field java/lang/System.out:Ljava/io/PrintStream; --- получаем outputStream
   15:	iload_1 - загружаем первую локлаьную переменную на верх стека - 12
   16:	invokevirtual	#3; //Method java/io/PrintStream.println:(I)V - печатаем
   19:	return - тут понятно.
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087227
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90, тебе всё тут понятно?
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087564
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо вам. Если честно, из более абстрактного объяснения понятнее)
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087567
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90,

То есть постИнкремент произойдет, но это уже мы не заметим
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087573
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

хотя я поторопился .... не совсем понял

Код: java
1.
Поэтому: считали значение, выполнили инкремент, присвоили значение, которое считали.


считали и проинкрементировали мы разные значения получается. и то, что проинкрементировали осталось гулять в памяти.
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087575
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и всё таки не ясно

Код: java
1.
2.
f = 5;
     f =  f++ + f++;


программа одиннадцать выдает.я расчитывал на 10
или получается только последний постинкремент не произойдет
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087577
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
f = 5;
     f =  f++ + ++f;



а вот так тоже 12, хотя сначала же произойдет постинкремент, а потом пре, если я не ошибаюсь с приоритетами
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087579
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
то есть 12 она выдает, а я расчитывал на 11
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087586
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90, ну конечно-же ты не поймешь. Как можно решать
квадратные уравнения не зная операций с дробной степенью?

Читай раз

как работает Lvalue и RValue.

http://www.rsdn.ru/article/cpp/lvalue.xml

Почитай еще два

http://www.ibm.com/developerworks/ru/library/j-noaccent/

особенно возле фрагмента

Пост-инкремент вместо пред-инкрементаНи при каких условиях вы не должны писать код, поведение которого зависит от того, использует вы префиксное или постфиксное инкрементирование переменной (кстати, то же самое справедливо и для С). Причина проста: такой код очень сложно понимать, поэтому он ведет к ошибкам. Если вы обнаружите, что в вашем коде важна эта разница, то следует разделить его на несколько строк таким образом, чтобы можно было использовать любой из операторов инкремента.
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087590
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пост-инкремент вместо пред-инкрементаНи при каких условиях вы не должны писать код, поведение которого зависит от того, использует вы префиксное или постфиксное инкрементирование переменной (кстати, то же самое справедливо и для С). Причина проста: такой код очень сложно понимать, поэтому он ведет к ошибкам. Если вы обнаружите, что в вашем коде важна эта разница, то следует разделить его на несколько строк таким образом, чтобы можно было использовать любой из операторов инкремента.


это я понимаю...я так, с теоретической точки зрения интересуюсь... в C++ вроде бы это все решается компилятором и такое выражение является неопределенным
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087604
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90,

про rvalue lvalue я ничего нового не вынес для себя. и всё-таки непонятно
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087610
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
redwhite90,

не ну, получается f++ это rvalue и получается, что это только значение.....блин, я запутался только
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087614
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
исходя из тестирования сделал для себя вывод, что последний постинкремент не выполнятся, если он выполняется для переменной в левой и правой части выражения.
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087616
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если эта переменная присутствует и в левой и в правой части выражения
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087620
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты знаешь, я всегда удивлялся способности разработчиков находить грабли
и долго и с наслаждением ходить по ним. Что тебе это даёт? Какой-то
садист специально нашёл парадокс в С++ и с наслаждением его
распространил. Вам-же разработчикам больше нечего делать как
ковырять это выражение подобно выковыриванию и рассматриванию
грязи из ушей или козявок из носа.

Неужели нет других интересных тем?
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38087621
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90исходя из тестирования сделал для себя вывод, что последний постинкремент не выполнятся, если он выполняется для переменной в левой и правой части выражения.
Он всегда выполняется. Тебе даже привели ассемблированный код. Читай между строк.

Если абстрактно, можно попробовать провести аналогию:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class A {
    private int f = 1;

    public int getF() {
        return this.f;
    }
    public void incF() {
        this.f = 2;
    }
}

A a = new A();
int val = a.getF();
System.out.println(val); //думаю, сомнений нет, что выдаст 1?
a.incF();
System.out.println(val); //если есть подозрение, что выдаст 2, то надо перекреститься, потому что val не менялось
val = a.getF();
System.out.println(val); //понятно, что станет 2


При постинкременте то же самое: переменная "заполняется" значением только после того, как мы ее "вычитываем" - совершаем очередную итерацию в ее жизненном цикле. Но при постинкременте переменная сначала считывается (с предыдущим значением), а только затем это значение инкременируется.

А что касается префиксного и постфиксного инкремента, то разница между ними не только в очередности инкрементирования, но и в самом механизме инкремента: постинкремент создает копию себя, возвращает старое значение, инкременирует новое значение. А преинкремент инкременирует себя и возвращает себя. Подглядел такую умную мысль: "при ++f объект возвращается по ссылке, а при f++ по значению".
...
Рейтинг: 0 / 0
помогите восстановить порядок выполнения операций
    #38088646
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
полдня думал об этом и наконец то понял))))
при постинкременте:
Ведь сначала происходит возврат значения в выражение(предыдущее значение f), потом происходит инкремент и f таки увеличивается и ее значение меняется, но потом происходит присваивание f значение выражения.


Все, спасибо)

Конечно Blazkowicz то же самое примерно писал, но я как то не осозновал.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / помогите восстановить порядок выполнения операций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]