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 :)
btw ас пишется с одним с :]
на русском :) на других языках это может быть не так.
ну извини, какой есть так и формулирует. :)
а вообще-то постфиксный оператор инкремента(декремента) выполняется _после_ выполнения _всей_ операции в которой он записан.
посему имеем --
i=i;
i++;
что и наблюдаем на экране при выполнении
Nikita
Apr 22, 2005, 18:29
я часто делаю ошибки
ну и что ?
Кстате читай беспредел ... там для тебя сообщение ...
rezul'tat i++ vozvrashaet 0.
С чего бы это?
на русском :) на других языках это может быть не так.
ну извини, какой есть так и формулирует. :)
а вообще-то постфиксный оператор инкремента(декремента) выполняется _после_ выполнения _всей_ операции в которой он записан.
посему имеем --
i=i;
i++;
что и наблюдаем на экране при выполнении
А почему не так например:
tmp = i;
i++;
i = tmp;
?
DaNYer
Apr 22, 2005, 18:57
precedence rulez blin.... vse vse vse. beru svoi slova obratno :)
А почему не так например:
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.
i++ должен
1. не менять значения переменной в процессе вычисления выражения
В моем варианте не меняет :)
2. после вычисления сделать инкремент переменной I
1. Вычисление: tmp = i;
2. Инкремент
3. Запись результата: i = tmp;
копии спецификации C приводить не буду :) хотя если кому-то интерестно аргументированно доказать мне что я не прав - с удовольствием подожду пока он найдет это место в спецификации и мне его покажет (читал я ее давно, может и подзабыл чего ;)
Cюрприз. Прикол в том, что в спецификации ничего на эту тему не написано ;))))
другой пример -
Это, очевидно, и не интересно ;)))
a che tut sporit'? eto je ne filosofiya.
чистейшей воды философия ;)
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 делает хитрую оптимизацию
не катит :) объясни почему у тебя пункт 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. И они оба в своем праве ;)
А почему нет? Выражение вычисляется в регистрах, результат записывается в конце в переменную. В спецификации не запрещено :)
http://www.cs.uu.nl/wais/html/na-dir/C-faq/abridged.html
И таже фигня с приведенным тобой примером. Компилятор его может посчитать, как ему на душу положит.
Вот, например, Intel C Compilerу на душу кладет получить 0, а GCC 1. И они оба в своем праве ;)
ааа, вот это уже лучше. я же говорил, что могу и ошибаться ;)
вобщем затык с присвоением результата постфиксного оператора присвоения той-же самой переменной. хм. ну. а нефиг присваивать; )
Оттуда же:
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.
вобщем затык с присвоением результата постфиксного оператора присвоения той-же самой переменной. хм. ну. а нефиг присваивать;
Это верно. Но про этот прикол почти никто не знает, и иногда встречаются интересные записи вроде: a[i]=i++;
И потом еще долго автор удивляется, а чего не работает-то ;)))
да уж :) вобщем люблю языки , у которых просто _нету_ таких проблем :)
vBulletin® v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.