Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters > C/C++
Register

Reply
 
LinkBack Thread Tools
Old 22.04.2005, 19:50   #16
Младенец
 
Join Date: 01 2005
Location: In a computer
Posts: 50
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally Posted by DaNYer
rezul'tat i++ vozvrashaet 0.
С чего бы это?
Reply With Quote
Old 22.04.2005, 19:52   #17
Младенец
 
Join Date: 01 2005
Location: In a computer
Posts: 50
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally Posted by nm
на русском на других языках это может быть не так.
ну извини, какой есть так и формулирует.

а вообще-то постфиксный оператор инкремента(декремента) выполняется _после_ выполнения _всей_ операции в которой он записан.

посему имеем --
i=i;
i++;
что и наблюдаем на экране при выполнении
А почему не так например:
tmp = i;
i++;
i = tmp;
?
Reply With Quote
Old 22.04.2005, 19:57   #18
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

precedence rulez blin.... vse vse vse. beru svoi slova obratno
Reply With Quote
Old 22.04.2005, 20:00   #19
ЙЦУКЕН
 
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 47
Posts: 3,118
Downloads: 0
Uploads: 0
Reputation: 5 | 0
Default

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 использовано
Reply With Quote
Old 22.04.2005, 20:00   #20
Профессор
 
Nikita's Avatar
 
Join Date: 01 2005
Location: Perm
Age: 38
Posts: 2,142
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

жаль что тут Ганса Андерсона нет ...
с ним приятно спорить ...
Reply With Quote
Old 22.04.2005, 20:03   #21
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

a che tut sporit'? eto je ne filosofiya.
Reply With Quote
Old 22.04.2005, 20:09   #22
Младенец
 
Join Date: 01 2005
Location: In a computer
Posts: 50
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally Posted by nm
i++ должен
1. не менять значения переменной в процессе вычисления выражения
В моем варианте не меняет

Quote:
2. после вычисления сделать инкремент переменной I
1. Вычисление: tmp = i;
2. Инкремент
3. Запись результата: i = tmp;

Quote:
копии спецификации C приводить не буду хотя если кому-то интерестно аргументированно доказать мне что я не прав - с удовольствием подожду пока он найдет это место в спецификации и мне его покажет (читал я ее давно, может и подзабыл чего
Cюрприз. Прикол в том, что в спецификации ничего на эту тему не написано )))

Quote:
другой пример -
Это, очевидно, и не интересно ))
Reply With Quote
Old 22.04.2005, 20:11   #23
Младенец
 
Join Date: 01 2005
Location: In a computer
Posts: 50
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally Posted by DaNYer
a che tut sporit'? eto je ne filosofiya.
чистейшей воды философия
Reply With Quote
Old 22.04.2005, 20:21   #24
ЙЦУКЕН
 
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 47
Posts: 3,118
Downloads: 0
Uploads: 0
Reputation: 5 | 0
Default

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 делает хитрую оптимизацию
Reply With Quote
Old 22.04.2005, 20:36   #25
Младенец
 
Join Date: 01 2005
Location: In a computer
Posts: 50
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

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. И они оба в своем праве
Reply With Quote
Old 22.04.2005, 20:43   #26
ЙЦУКЕН
 
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 47
Posts: 3,118
Downloads: 0
Uploads: 0
Reputation: 5 | 0
Default

Quote:
Originally Posted by csa
А почему нет? Выражение вычисляется в регистрах, результат записывается в конце в переменную. В спецификации не запрещено


http://www.cs.uu.nl/wais/html/na-dir.../abridged.html


И таже фигня с приведенным тобой примером. Компилятор его может посчитать, как ему на душу положит.

Вот, например, Intel C Compilerу на душу кладет получить 0, а GCC 1. И они оба в своем праве
ааа, вот это уже лучше. я же говорил, что могу и ошибаться

вобщем затык с присвоением результата постфиксного оператора присвоения той-же самой переменной. хм. ну. а нефиг присваивать; )
Reply With Quote
Old 22.04.2005, 20:43   #27
Младенец
 
Join Date: 01 2005
Location: In a computer
Posts: 50
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Оттуда же:
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.
Reply With Quote
Old 22.04.2005, 20:46   #28
Младенец
 
Join Date: 01 2005
Location: In a computer
Posts: 50
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally Posted by nm
вобщем затык с присвоением результата постфиксного оператора присвоения той-же самой переменной. хм. ну. а нефиг присваивать;
Это верно. Но про этот прикол почти никто не знает, и иногда встречаются интересные записи вроде: a[i]=i++;
И потом еще долго автор удивляется, а чего не работает-то ))
Reply With Quote
Old 22.04.2005, 21:09   #29
ЙЦУКЕН
 
Join Date: 07 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Age: 47
Posts: 3,118
Downloads: 0
Uploads: 0
Reputation: 5 | 0
Default

да уж вобщем люблю языки , у которых просто _нету_ таких проблем
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 11:46.


Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.