22.04.2005, 18:50
|
#16
|
|
Младенец
Join Date: 01 2005
Location: In a computer
Posts: 50
Rep Power: 0
|
Quote:
|
Originally Posted by DaNYer
rezul'tat i++ vozvrashaet 0.
|
С чего бы это?
|
|
|
|
22.04.2005, 18:52
|
#17
|
|
Младенец
Join Date: 01 2005
Location: In a computer
Posts: 50
Rep Power: 0
|
Quote:
|
Originally Posted by nm
на русском  на других языках это может быть не так.
ну извини, какой есть так и формулирует.
а вообще-то постфиксный оператор инкремента(декремента) выполняется _после_ выполнения _всей_ операции в которой он записан.
посему имеем --
i=i;
i++;
что и наблюдаем на экране при выполнении
|
А почему не так например:
tmp = i;
i++;
i = tmp;
?
|
|
|
|
22.04.2005, 18:57
|
#18
|
|
Banned
Join Date: 10 2002
Location: Brooklyn, New York
Age: 48
Posts: 3,760
Rep Power: 0
|
precedence rulez blin.... vse vse vse. beru svoi slova obratno
|
|
|
|
22.04.2005, 19:00
|
#19
|
|
ЙЦУКЕН
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 56
Posts: 3,118
Rep Power: 0
|
Quote:
|
Originally Posted by csa
А почему не так например:
tmp = i;
i++;
i = tmp;
?
|
i++ должен
1. не менять значения переменной в процессе вычисления выражения
2. после вычисления сделать инкремент переменной I
копии спецификации C приводить не буду  хотя если кому-то интерестно аргументированно доказать мне что я не прав - с удовольствием подожду пока он найдет это место в спецификации и мне его покажет (читал я ее давно, может и подзабыл чего
другой пример -
Code:
int i = 2;
int a;
a = i + 10 * ++i;
это превращается в
i = i+1;
a = i + 10*i;
и в результате получается 33  компилятор со мной согласен
т.е. в префиксной форме увеличение значения I происходит _до_ начала вычисления всего выражения, где I использовано
|
|
|
|
22.04.2005, 19:00
|
#20
|
|
Профессор
Join Date: 01 2005
Location: Perm
Age: 47
Posts: 2,142
Rep Power: 0
|
жаль что тут Ганса Андерсона нет ...
с ним приятно спорить ...
|
|
|
|
22.04.2005, 19:03
|
#21
|
|
Banned
Join Date: 10 2002
Location: Brooklyn, New York
Age: 48
Posts: 3,760
Rep Power: 0
|
a che tut sporit'? eto je ne filosofiya.
|
|
|
|
22.04.2005, 19:09
|
#22
|
|
Младенец
Join Date: 01 2005
Location: In a computer
Posts: 50
Rep Power: 0
|
Quote:
|
Originally Posted by nm
i++ должен
1. не менять значения переменной в процессе вычисления выражения
|
В моем варианте не меняет
Quote:
|
2. после вычисления сделать инкремент переменной I
|
1. Вычисление: tmp = i;
2. Инкремент
3. Запись результата: i = tmp;
Quote:
копии спецификации C приводить не буду хотя если кому-то интерестно аргументированно доказать мне что я не прав - с удовольствием подожду пока он найдет это место в спецификации и мне его покажет (читал я ее давно, может и подзабыл чего
|
Cюрприз. Прикол в том, что в спецификации ничего на эту тему не написано  )))
Это, очевидно, и не интересно  ))
|
|
|
|
22.04.2005, 19:11
|
#23
|
|
Младенец
Join Date: 01 2005
Location: In a computer
Posts: 50
Rep Power: 0
|
Quote:
|
Originally Posted by DaNYer
a che tut sporit'? eto je ne filosofiya.
|
чистейшей воды философия
|
|
|
|
22.04.2005, 19:21
|
#24
|
|
ЙЦУКЕН
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 56
Posts: 3,118
Rep Power: 0
|
Quote:
|
Originally Posted by csa
1. Вычисление: tmp = i;
2. Инкремент
3. Запись результата: i = tmp;
|
не катит  объясни почему у тебя пункт 3 возник
i = i+1 всегда выполняется _после_ выполнения выражения .
берем
Code:
int i = 2;
i = i+ 10 * i++ + 100*i++;
это выполняется как
i = i + 10 * i + 100*i;
i += 1;
i += 1;
т.е.
i = 2 + 10 * 2 + 100*2;
i = 222 + 1;
i = 223 + 1;
в итоге имеем 224
ассемблерный код не покажу, т.к. gcc делает хитрую оптимизацию
|
|
|
|
22.04.2005, 19:36
|
#25
|
|
Младенец
Join Date: 01 2005
Location: In a computer
Posts: 50
Rep Power: 0
|
Quote:
|
Originally Posted by nm
не катит  объясни почему у тебя пункт 3 возник
|
А почему нет? Выражение вычисляется в регистрах, результат записывается в конце в переменную. В спецификации не запрещено
http://www.cs.uu.nl/wais/html/na-dir.../abridged.html
Quote:
3.3: What should the code "int i = 3; i = i++;" do?
A: The expression is undefined.
|
И таже фигня с приведенным тобой примером. Компилятор его может посчитать, как ему на душу положит.
Вот, например, Intel C Compilerу на душу кладет получить 0, а GCC 1. И они оба в своем праве
|
|
|
|
22.04.2005, 19:43
|
#26
|
|
ЙЦУКЕН
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 56
Posts: 3,118
Rep Power: 0
|
Quote:
|
Originally Posted by csa
А почему нет? Выражение вычисляется в регистрах, результат записывается в конце в переменную. В спецификации не запрещено
http://www.cs.uu.nl/wais/html/na-dir.../abridged.html
И таже фигня с приведенным тобой примером. Компилятор его может посчитать, как ему на душу положит.
Вот, например, Intel C Compilerу на душу кладет получить 0, а GCC 1. И они оба в своем праве 
|
ааа, вот это уже лучше. я же говорил, что могу и ошибаться
вобщем затык с присвоением результата постфиксного оператора присвоения той-же самой переменной. хм. ну. а нефиг присваивать; )
|
|
|
|
22.04.2005, 19:43
|
#27
|
|
Младенец
Join Date: 01 2005
Location: In a computer
Posts: 50
Rep Power: 0
|
Оттуда же:
Quote:
3.8: What's a "sequence point"?
A: A point (at the end of a full expression, or at the ||, &&, ?:,
or comma operators, or just before a function call) at which all
side effects are guaranteed to be complete.
|
|
|
|
|
22.04.2005, 19:46
|
#28
|
|
Младенец
Join Date: 01 2005
Location: In a computer
Posts: 50
Rep Power: 0
|
Quote:
|
Originally Posted by nm
вобщем затык с присвоением результата постфиксного оператора присвоения той-же самой переменной. хм. ну. а нефиг присваивать;
|
Это верно. Но про этот прикол почти никто не знает, и иногда встречаются интересные записи вроде: a[i]=i++;
И потом еще долго автор удивляется, а чего не работает-то  ))
|
|
|
|
22.04.2005, 20:09
|
#29
|
|
ЙЦУКЕН
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 56
Posts: 3,118
Rep Power: 0
|
да уж  вобщем люблю языки , у которых просто _нету_ таких проблем
|
|
|
|
|
All times are GMT. The time now is 02:22. |
|
|