AKB Forums

Go Back   AKB Forums > Technical sections > Languages, Compilers and Interpreters > C/C++
Home Register Blogs FAQ Members List Calendar Downloads Arcade Mark Forums Read

Troubles when posting message? Click here! :: Проблемы с отправлением сообщения? Нажмите сюда!

Reply
 
LinkBack Thread Tools Display Modes
Old Apr 22, 2005, 17:40  
Профессор
 
Nikita's Avatar
 
Join Date: Jan 2005
Location: Perm
Posts: 2,142
Rep Power: 4
Reputation: 10
Send a message via ICQ to Nikita
Wink задачка для ассов c/c++

с виду тривиальная задачка ...

#include <stdio.h>
int main (int argc, unsigned char **argv) {
int i = 0;
i = i++;
printf ("i = %d\n", i);
return 0;
}

какое значение i будет выведенно ?
Nikita is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 18:50   #16
Младенец
 
Join Date: Jan 2005
Location: In a computer
Posts: 50
Rep Power: 0
Reputation: 10
Quote:
Originally Posted by DaNYer
rezul'tat i++ vozvrashaet 0.
С чего бы это?
csa is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 18:52   #17
Младенец
 
Join Date: Jan 2005
Location: In a computer
Posts: 50
Rep Power: 0
Reputation: 10
Quote:
Originally Posted by nm
на русском на других языках это может быть не так.
ну извини, какой есть так и формулирует.

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

посему имеем --
i=i;
i++;
что и наблюдаем на экране при выполнении
А почему не так например:
tmp = i;
i++;
i = tmp;
?
csa is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 18:57   #18
Banned
 
DaNYer's Avatar
 
Join Date: Oct 2002
Location: Brooklyn, New York
Posts: 3,760
Rep Power: 0
Reputation: 10
precedence rulez blin.... vse vse vse. beru svoi slova obratno
DaNYer is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 19:00   #19
ЙЦУКЕН
 
Join Date: Jul 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Posts: 3,114
Rep Power: 7
Reputation: 10
Send a message via ICQ to nm
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 использовано
nm is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 19:00   #20
Профессор
 
Nikita's Avatar
 
Join Date: Jan 2005
Location: Perm
Posts: 2,142
Rep Power: 4
Reputation: 10
Send a message via ICQ to Nikita
жаль что тут Ганса Андерсона нет ...
с ним приятно спорить ...
Nikita is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 19:03   #21
Banned
 
DaNYer's Avatar
 
Join Date: Oct 2002
Location: Brooklyn, New York
Posts: 3,760
Rep Power: 0
Reputation: 10
a che tut sporit'? eto je ne filosofiya.
DaNYer is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 19:09   #22
Младенец
 
Join Date: Jan 2005
Location: In a computer
Posts: 50
Rep Power: 0
Reputation: 10
Quote:
Originally Posted by nm
i++ должен
1. не менять значения переменной в процессе вычисления выражения
В моем варианте не меняет

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

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

Quote:
другой пример -
Это, очевидно, и не интересно ))
csa is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 19:11   #23
Младенец
 
Join Date: Jan 2005
Location: In a computer
Posts: 50
Rep Power: 0
Reputation: 10
Quote:
Originally Posted by DaNYer
a che tut sporit'? eto je ne filosofiya.
чистейшей воды философия
csa is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 19:21   #24
ЙЦУКЕН
 
Join Date: Jul 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Posts: 3,114
Rep Power: 7
Reputation: 10
Send a message via ICQ to nm
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 делает хитрую оптимизацию
nm is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 19:36   #25
Младенец
 
Join Date: Jan 2005
Location: In a computer
Posts: 50
Rep Power: 0
Reputation: 10
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. И они оба в своем праве
csa is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 19:43   #26
ЙЦУКЕН
 
Join Date: Jul 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Posts: 3,114
Rep Power: 7
Reputation: 10
Send a message via ICQ to nm
Quote:
Originally Posted by csa
А почему нет? Выражение вычисляется в регистрах, результат записывается в конце в переменную. В спецификации не запрещено


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


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

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

вобщем затык с присвоением результата постфиксного оператора присвоения той-же самой переменной. хм. ну. а нефиг присваивать; )
nm is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 19:43   #27
Младенец
 
Join Date: Jan 2005
Location: In a computer
Posts: 50
Rep Power: 0
Reputation: 10
Оттуда же:
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.
csa is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 19:46   #28
Младенец
 
Join Date: Jan 2005
Location: In a computer
Posts: 50
Rep Power: 0
Reputation: 10
Quote:
Originally Posted by nm
вобщем затык с присвоением результата постфиксного оператора присвоения той-же самой переменной. хм. ну. а нефиг присваивать;
Это верно. Но про этот прикол почти никто не знает, и иногда встречаются интересные записи вроде: a[i]=i++;
И потом еще долго автор удивляется, а чего не работает-то ))
csa is offline   Reply With Quote Quote selected
Old Apr 22, 2005, 20:09   #29
ЙЦУКЕН
 
Join Date: Jul 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Posts: 3,114
Rep Power: 7
Reputation: 10
Send a message via ICQ to nm
да уж вобщем люблю языки , у которых просто _нету_ таких проблем
nm is offline   Reply With Quote Quote selected
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
задачка на тему Самолет mk General 186 Dec 23, 2004 16:07
Задачка про пингвина Dorothy General 282 Aug 13, 2004 14:53
Простенькая задачка ;) dolphin Web Development 3 Nov 1, 2003 15:03
Задачка Shirinyan Fun 13 Oct 22, 2003 13:41
Задачка Amph Algorithms 1 May 29, 2002 04:02


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


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
This board was founded on September 29, 2001
Powered by Viper Internet

Affordable Web Hosting | ParevNet

Buy text link