PDA

View Full Version : задачка для ассов c/c++


Nikita
Apr 22, 2005, 17:40
с виду тривиальная задачка ...

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

какое значение i будет выведенно ?

DaNYer
Apr 22, 2005, 17:44
i=i++ eto kaneshna kruto :)

z0mbie
Apr 22, 2005, 17:47
0

DaNYer
Apr 22, 2005, 17:49
rezul'tat i++ vozvrashaet 0. znachit tipa vse v poryadke. a potom etot rezul'tat pripisivaetsya k i. znachit budet 0 :)

DaNYer
Apr 22, 2005, 17:52
poprobui eshe i=printf("%d", i); ili eshe chego.

z0mbie
Apr 22, 2005, 17:57
btw ас пишется с одним с :]

Nikita
Apr 22, 2005, 17:59
а можете обьяснить почему ?

DaNYer
Apr 22, 2005, 18:05
ya vrode obyasnil. rezul'tat operacii i++ vozvrashaet 0

z0mbie
Apr 22, 2005, 18:05
потому что приоритет унарного оператора выше чем оператора присвоения

Nikita
Apr 22, 2005, 18:06
не обьяснил

DaNYer
Apr 22, 2005, 18:14
imeyushie glaza da uvidyat...

Nikita
Apr 22, 2005, 18:15
Danyer
пойми меня правильно
я имею ввиду по стандарту
а не логикой ... твоей логикой ;)

DaNYer
Apr 22, 2005, 18:21
oi, sorry ya ne zametil, dlya accov...

acc eto je latinica... sorry. molchu.

xotya zombie toje neslabo skazal :)

nm
Apr 22, 2005, 18:23
btw ас пишется с одним с :]

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

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

посему имеем --
i=i;
i++;
что и наблюдаем на экране при выполнении

Nikita
Apr 22, 2005, 18:29
я часто делаю ошибки
ну и что ?
Кстате читай беспредел ... там для тебя сообщение ...

csa
Apr 22, 2005, 18:50
rezul'tat i++ vozvrashaet 0.
С чего бы это?

csa
Apr 22, 2005, 18:52
на русском :) на других языках это может быть не так.
ну извини, какой есть так и формулирует. :)

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

посему имеем --
i=i;
i++;
что и наблюдаем на экране при выполнении

А почему не так например:
tmp = i;
i++;
i = tmp;
?

DaNYer
Apr 22, 2005, 18:57
precedence rulez blin.... vse vse vse. beru svoi slova obratno :)

nm
Apr 22, 2005, 19:00
А почему не так например:
tmp = i;
i++;
i = tmp;
?


i++ должен
1. не менять значения переменной в процессе вычисления выражения
2. после вычисления сделать инкремент переменной I

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

другой пример -

int i = 2;
int a;
a = i + 10 * ++i;


это превращается в
i = i+1;
a = i + 10*i;

и в результате получается 33 ;) компилятор со мной согласен :)

т.е. в префиксной форме увеличение значения I происходит _до_ начала вычисления всего выражения, где I использовано

Nikita
Apr 22, 2005, 19:00
жаль что тут Ганса Андерсона нет ...
с ним приятно спорить ... :(

DaNYer
Apr 22, 2005, 19:03
a che tut sporit'? eto je ne filosofiya.

csa
Apr 22, 2005, 19:09
i++ должен
1. не менять значения переменной в процессе вычисления выражения

В моем варианте не меняет :)


2. после вычисления сделать инкремент переменной I

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


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

Cюрприз. Прикол в том, что в спецификации ничего на эту тему не написано ;))))


другой пример -

Это, очевидно, и не интересно ;)))

csa
Apr 22, 2005, 19:11
a che tut sporit'? eto je ne filosofiya.
чистейшей воды философия ;)

nm
Apr 22, 2005, 19:21
1. Вычисление: tmp = i;
2. Инкремент
3. Запись результата: i = tmp;


не катит :) объясни почему у тебя пункт 3 возник

i = i+1 всегда выполняется _после_ выполнения выражения .
берем


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 делает хитрую оптимизацию

csa
Apr 22, 2005, 19:36
не катит :) объясни почему у тебя пункт 3 возник
А почему нет? Выражение вычисляется в регистрах, результат записывается в конце в переменную. В спецификации не запрещено :)


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

3.3: What should the code "int i = 3; i = i++;" do?
A: The expression is undefined.


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

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

nm
Apr 22, 2005, 19:43
А почему нет? Выражение вычисляется в регистрах, результат записывается в конце в переменную. В спецификации не запрещено :)


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


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

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

ааа, вот это уже лучше. я же говорил, что могу и ошибаться ;)

вобщем затык с присвоением результата постфиксного оператора присвоения той-же самой переменной. хм. ну. а нефиг присваивать; )

csa
Apr 22, 2005, 19:43
Оттуда же:

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
Apr 22, 2005, 19:46
вобщем затык с присвоением результата постфиксного оператора присвоения той-же самой переменной. хм. ну. а нефиг присваивать;

Это верно. Но про этот прикол почти никто не знает, и иногда встречаются интересные записи вроде: a[i]=i++;
И потом еще долго автор удивляется, а чего не работает-то ;)))

nm
Apr 22, 2005, 20:09
да уж :) вобщем люблю языки , у которых просто _нету_ таких проблем :)