Andrey Starodubtsev ([info]darky2000) wrote,
@ 2007-05-11 14:39:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Current music:Man With No Name - Evolution



Anhen, 11.05.2007 14:03:27:
KoloDen
Привет, я общительный пацан, люблю поболтать, особенно с классными девченками. Но, чтобы поговорить со мной, ответьте на простую задачку анти-спам бота. Вот она:
int i = 5;
i = ++i + ++i;
Вопрос: Чему равно i?

Stefmania
14

KoloDen
Гы. Признайся, ты не девченка, а 40-летний одмин, да?



DarkMist, 14:03:54:
хм 8-)



Anhen, 14:06:01:
что хм?
13 или 14?



DarkMist, 14:06:32:
бля я завис.
то что 14 это точно
а вот почему я не могу понять



Anhen, 14:07:43:
тогда откуда ты знаешь что точно 14?



DarkMist, 14:09:18:
бля 8-)
я понял



DarkMist, 14:09:26:
сцуко, хитро 8-)



Anhen, 14:09:27:
ну?



Anhen, 14:09:48:
ну?!?!



DarkMist, 14:09:48:
откуда знаю что 14:
perl -e "$i = 5; $i = ++$i + ++$i; print $i"



DarkMist, 14:10:08:
почему 14:
пришлось открывать вижи и смотреть асмовый код



Anhen, 14:10:12:
и?



DarkMist, 14:11:39:
когда вычисляется выражение, сначала вычисляются его операнды
но оператор ++i - это не i + 1, а i += 1
то есть сначала к i прибавляется 1, потом к i еще раз прибавляется единица а потом к i прибавляется i получается 7+7, то есть 14



Anhen, 14:12:33:
черт
красиво!



Anhen, 14:13:32:
а вот в пхп 13



DarkMist, 14:39:02:
пхп сосет 8-)



Anhen, 14:39:21:
пхп логичен



DarkMist, 14:40:06:
в данном случае - правильный ответ 14, он согласуется с логикой, а вот 13 - нет



Anhen, 14:40:39:
имхо 13 логичнее
(5+1) + (5+1)+1



DarkMist, 14:48:04:
еще раз.
++i это не i + 1
это так же логично как обман зрения. только здесь не обман зрения, а инерция мышления



Anhen, 14:49:24:
i += 1 это i = i+1



DarkMist, 14:50:10:
да



DarkMist, 14:51:22:
исходный statement выглядит так:
i = ( i += 1, i ) + ( i += 1, i )
в этом случае все смотриться логично, aren't you?



Anhen, 14:58:45:
я остановила работу всего джавского отдела



Anhen, 14:58:52:
сидят пытаются получить 14



DarkMist, 15:00:27:
на жабе шо ле 8-)?



Anhen, 15:00:59:
ага



Anhen, 15:01:07:
у них 13



Anhen, 15:01:13:
и куча теорий



Anhen, 15:02:28:
не знаю, наша контора считает что логика на стороне 13



Anhen, 15:07:09:
на флексе 13
подключились дельфисты :))))))



Anhen, 15:07:20:
бугага
башорг зло



Anhen, 15:08:49:
и в сишарпе 13



Anhen, 15:09:13:
а у дельфистов нет инкрементов



DarkMist, 15:21:28:
на перле и c++ 14. все остальное от лукавого 8-)



Anhen, 15:22:04:
мои коллеги просили передать, что ты сволочь и башорг твой блядский тоже
цытата



DarkMist, 15:23:52:
8-)))





Page 1 of 3
<<[1] [2] [3] >>

(147 comments) - (Post a new comment)

Повторюсь
[info]anhen
2007-05-11 11:44 am UTC (link)
Ты сволочь и башорг твой блядский тоже
Работа встала
Мы ставим си без плюсов и паскаль
Для чистоты эксперимента

(Reply to this) (Thread)

Re: Повторюсь
[info]mr_st
2007-05-11 11:57 am UTC (link)
Undefined behavior это называется ;)

(Reply to this) (Parent)(Thread)

Re: Повторюсь - [info]buran_, 2007-05-11 03:40 pm UTC
Re: Повторюсь - [info]buran_, 2007-05-11 03:42 pm UTC
Re: Повторюсь - [info]_leonid, 2007-05-11 12:23 pm UTC
Re: Повторюсь - [info]mr_st, 2007-05-11 12:32 pm UTC
Re: Повторюсь - [info]_leonid, 2007-05-11 12:36 pm UTC
Во загнул :) - [info]mr_st, 2007-05-11 12:44 pm UTC
Re: Во загнул :) - [info]_leonid, 2007-05-11 01:01 pm UTC
Re: Во загнул :) - [info]darky2000, 2007-05-11 01:12 pm UTC
Re: Во загнул :) - [info]_leonid, 2007-05-11 03:31 pm UTC
Re: Во загнул :) - [info]_zerg, 2007-05-11 03:34 pm UTC
Re: Повторюсь - [info]alex_inside, 2007-05-11 03:45 pm UTC
Re: Повторюсь - [info]buran_, 2007-05-11 03:53 pm UTC
Re: Повторюсь - [info]buran_, 2007-05-11 03:51 pm UTC

[info]navka
2007-05-11 12:13 pm UTC (link)
КАЙФ:)

(Reply to this)


[info]golubev
2007-05-11 01:12 pm UTC (link)
отлично!
правда, стандарт Си говорит, что результат такого выражение не определен. ;)
и, в принципе, может быть хоть 238 :)

(Reply to this) (Thread)


[info]vaddimka
2007-05-13 01:35 pm UTC (link)
это где в стандарте такой бред написан? )

(Reply to this) (Parent)(Thread)

(no subject) - [info]darky2000, 2007-05-14 09:54 am UTC

[info]one_in
2007-05-11 02:13 pm UTC (link)
Блин, этот прикол "съел наш моск". (-8
Отфорвардил его с БОРа нескольким разным людям, и у всех / со всеми примерно такие же дискуссии завязались. :-)

(Reply to this)


(Anonymous)
2007-05-11 02:35 pm UTC (link)
"а у дельфистов нет инкрементов"

Есть, но Inc(n) это не функция а процедура :)

(Reply to this) (Thread)


[info]anhen
2007-05-11 03:05 pm UTC (link)
i = ++i + ++i под дельфи не работает
значит дельфи в эксперименте не участвует

хотя мы под паскаль код уже упростили :) можно возвращать дельфи :)

(Reply to this) (Parent)

(no subject) - [info]khathi, 2007-05-13 02:32 pm UTC
Ларри Эллисон за чертову дюжину! :)
[info]p_a_s_h_a
2007-05-11 03:31 pm UTC (link)
declare
  i number(2);
  function plus_plus(a in out number) return number is begin a:= a+1; return a; end;
begin 
  i:= 5;
  i:= plus_plus(i)+plus_plus(i);
  dbms_output.put_line(substr('Value of i='||i,1,255));
end;
/
Value of i=13

(Reply to this) (Thread)

Re: Ларри Эллисон за чертову дюжину! :)
[info]buran_
2007-05-11 03:43 pm UTC (link)
Тут используется юзерская функция соответсвенно сиквенс поинтов нет и никакого излома логики не происходит. Всё чётко определено.

(Reply to this) (Parent)

Re: Ларри Эллисон за чертову дюжину! :) - (Anonymous), 2007-05-11 03:59 pm UTC
Re: Ларри Эллисон за чертову дюжину! :) - [info]druxa_druxa, 2007-05-12 08:45 am UTC
Re: Ларри Эллисон за чертову дюжину! :) - [info]darky2000, 2007-05-14 09:58 am UTC
Re: Ларри Эллисон за чертову дюжину! :) - [info]druxa_druxa, 2007-05-14 01:54 pm UTC
Re: Ларри Эллисон за чертову дюжину! :) - [info]darky2000, 2007-05-11 03:59 pm UTC

[info]alex_inside
2007-05-11 03:34 pm UTC (link)
Правильно 13 должно быть.


++i должна делать примерно это: { static i; i = i+1; return i;}
а вот i++ должна возаращать вот так: {static i; i = i+1; return i-1;}

(ну или смотря в каком языке то нужно юзать global, или оператор разыменования.)



Так как ++i равнасильна (i+=1) и равна (i = i+1) т.е. функция (которая помимо увеличения i) возвращает значение i+1, а не ссылку на i (и значение i) после того как оно инкрементируется во втором месте.

т.е. функция работает так

i = (6=5+1) + (7=6+1);
i = 6 + 7
i = 13

(Reply to this) (Thread)


(Anonymous)
2007-05-11 09:47 pm UTC (link)
http://darky2000.livejournal.com/72865.html?thread=112545#t112545

"озвращать ... надо ссылку, а не значение переменной."

(Reply to this) (Parent)

(no subject) - [info]dalesays, 2007-05-12 04:01 pm UTC
(no subject) - [info]r1zn, 2007-05-14 04:50 am UTC

[info]dimadams
2007-05-11 04:13 pm UTC (link)
гнушный компилятор дает 13 на такой код:

int main()
{
volatile int i=5;
i= ++i + ++i;
printf("%d\n", i);
}

а если убрать "volatile", тогда - 14:
=======
.file "test.c"
.section .rodata
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
movl $5, -8(%ebp)
movl -8(%ebp), %eax
incl %eax
movl %eax, -8(%ebp)
movl -8(%ebp), %edx
movl -8(%ebp), %eax
incl %eax
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
leal (%edx,%eax), %eax
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
addl $36, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1.1"
.section .note.GNU-stack,"",@progbits
=======

(Reply to this) (Thread)


[info]legionarius
2007-05-12 06:16 am UTC (link)
Да, вы правы. Все дело в том, что компилятор оптимизирует работу с помощью регистров.
С volatile правильный ответ.

(Reply to this) (Parent)

(no subject) - [info]eugene_bond, 2007-05-12 08:09 am UTC
(no subject) - [info]phebbus, 2007-05-12 10:54 am UTC
(no subject) - [info]khathi, 2007-05-13 02:42 pm UTC
(no subject) - [info]phebbus, 2007-05-13 02:50 pm UTC
(no subject) - [info]khathi, 2007-05-13 03:12 pm UTC
(no subject) - [info]darky2000, 2007-05-14 10:07 am UTC
Раз уж взялись за анализ кода...
[info]one_in
2007-05-11 05:02 pm UTC (link)
Ну, раз уж взялись за анализ кода, сгенерённого разными компиляторами...
Мне больше всего понравился лаконичный код, сгенерированный MSVC6 в релизном режиме с обычными оптимизациями.
Исходник:
int main() {
int i = 5;
i = ++i + ++i;
printf("%d", i);
return 0;
}

Машинный код:
00401000 push 0Eh
00401002 push 407030h
00401007 call 00401020
0040100C add esp,8
0040100F xor eax,eax
00401011 ret

Красота! :-)

(Reply to this) (Thread)

Re: Раз уж взялись за анализ кода...
[info]buran_
2007-05-11 05:44 pm UTC (link)
Гм, VS только вызов printf с аргументами осилил экспортнуть в асм?

(Reply to this) (Parent)(Thread)

Re: Раз уж взялись за анализ кода... - [info]one_in, 2007-05-11 05:54 pm UTC
Re: Раз уж взялись за анализ кода... - [info]buran_, 2007-05-11 05:56 pm UTC
Re: Раз уж взялись за анализ кода... - [info]sobaker, 2007-05-11 06:00 pm UTC
Re: Раз уж взялись за анализ кода... - [info]buran_, 2007-05-11 08:40 pm UTC

[info]loginex
2007-05-11 05:46 pm UTC (link)
гыгы, у нас тоже сеня баталии были на эту тему, все думают, что должно быть 13, а при компиляции - 14. Дизассемблер прояснил дело)

(Reply to this)


[info]andrews_answer
2007-05-11 06:21 pm UTC (link)
Волшебные комменты, оборжался просто :)

(Reply to this) (Thread)


[info]201614
2007-05-21 02:38 am UTC (link)
..я ушла в слюни))

(Reply to this) (Parent)


[info]lonk
2007-05-11 06:44 pm UTC (link)
Комменты.

(Reply to this)

(Reply from suspended user)

[info]21fa
2007-05-11 11:11 pm UTC (link)
бля, пацаны, вы что реально существуете такие?

(Reply to this) (Thread)


[info]hakkim
2007-07-25 12:52 pm UTC (link)
+1

(Reply to this) (Parent)


[info]saint_erasty
2007-05-11 11:51 pm UTC (link)
14.
я прогрузилсо.

(Reply to this) (Thread)


[info]saint_erasty
2007-05-11 11:53 pm UTC (link)
бля.
при первой операции становица 6, а при второй 7.
6+7=13.
я ещё более прогрузилсо.

(Reply to this) (Parent)


[info]nigative
2007-05-12 01:09 am UTC (link)
7+7 чего не понятного? Разные компиляторы делают это по своему. Операция не стабильна и нерекомендуема вообще-то.

(Reply to this) (Thread)


[info]saint_erasty
2007-05-12 01:15 am UTC (link)
а откуда это у вас взялось 7+7?
особенно первая 7.

(Reply to this) (Parent)(Thread)

(no subject) - [info]cpcat, 2007-05-12 06:19 am UTC
(no subject) - [info]saint_erasty, 2007-05-12 06:48 am UTC
(no subject) - [info]cpcat, 2007-05-12 07:16 am UTC
(no subject) - [info]saint_erasty, 2007-05-12 07:18 am UTC
(no subject) - [info]nigative, 2007-05-12 08:39 am UTC

[info]kenji_no_sorata
2007-05-12 02:25 am UTC (link)
Есть в дельфи инкременты, не надо траля-ля

i:=5;
i:=inc(inc(i))+inc(inc(i))

Тьфу, блин, ну вас нафиг!!!

(Reply to this)


[info]jenyay
2007-05-12 05:25 am UTC (link)
А еще красиво смотрится код i++ + ++i

(Reply to this) (Thread)


[info]saint_erasty
2007-05-12 07:20 am UTC (link)
или (++i + i++).
на бомбардировщик похоже.

(Reply to this) (Parent)


[info]donvitori
2007-05-12 07:46 am UTC (link)
Я за результат 13.

(Reply to this) (Thread)


[info]druxa_druxa
2007-05-12 08:51 am UTC (link)
а я за результат 6 :)
сначала исполняем оператор =, а потом комитим побочные эффекты инкрементов в i. кстати по стандарту компилятор вполне может себе это позволить, побочный эффект инкремента можно выполнять в любой момент вычисления выражения.

(Reply to this) (Parent)(Thread)

(no subject) - [info]darky2000, 2007-05-14 09:44 am UTC

[info]ehvh
2007-05-12 10:01 am UTC (link)
Это проблема из той же серии что
for (i=0;i<=i;i++)
неважно на каком языке, сишный синтаксис не причём, важна конструкция, паскалевские "for i:=0 to i<=i do" например тоже нагляден

большинство нормальных компиляторы считает i статичной (object pascal и delphi например), запоминая значение перед циклом, но некоторые считают i динамичной и подвисают (даже паскалевские, на школьном БК в начале девяностых помится тестил, подвисало).

(Reply to this)


[info]makiavelli
2007-05-12 10:03 am UTC (link)
Это был самый феерический пост на башорге! Два часа вчера пытался утий от результата 13 )))

(Reply to this)


[info]nb1967
2007-05-12 12:10 pm UTC (link)
//Javascript:

var i=5;
i=++i + ++i;
alert(i);

// 13 даёт

(Reply to this)


[info]nb1967
2007-05-12 12:14 pm UTC (link)
#ruby
i=5
i=++i + ++i
puts i

# 10 !!!

(Reply to this) (Thread)


[info]vanhelsing16
2007-05-12 12:35 pm UTC (link)
ААА!

(Reply to this) (Parent)

(no subject) - [info]showerdance, 2007-05-13 08:12 pm UTC
(no subject) - [info]eugzol, 2007-05-13 10:48 pm UTC

[info]ehvh
2007-05-12 12:27 pm UTC (link)
короче компиляторы — 14, интерпретаторы — 13, и это правильно. А 10 это какая-то лажа, 5+5 вычисляет.

(Reply to this) (Thread)


[info]drdaeman
2007-05-13 11:42 am UTC (link)
Все правильно, 10. Просто в Ruby нет префиксного инкремента и ++i это +(+i). Для Ruby надо говорить puts (i += 1) + (i += 1), что и даст 13.

(Reply to this) (Parent)

(no subject) - [info]khathi, 2007-05-13 02:41 pm UTC
(no subject) - [info]darky2000, 2007-05-14 09:40 am UTC
(no subject) - [info]khathi, 2007-05-14 10:36 am UTC

[info]nb1967
2007-05-12 12:28 pm UTC (link)
// Java
class Test {
public static void main (String [] args) {
int i=5;
i=++i + ++i;
System.out.println(i);
// 13
}
};

(Reply to this) (Thread)

в джава всё жёстко по спеке
[info]d3ni5
2007-05-15 12:18 pm UTC (link)
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.15.1

The result of the prefix increment expression is not a variable, but a value. ..., the value 1 is added to the value of the variable and the sum is stored back into the variable.
.... The value of the prefix increment expression is the value of the variable after the new value is stored.

можно создать второй топик:
i=1;
i=i++;
чему теперь равно i?

(Reply to this) (Parent)(Thread)

Re: в джава всё жёстко по спеке - [info]nb1967, 2007-05-16 08:22 pm UTC

(147 comments) - (Post a new comment)

Page 1 of 3
<<[1] [2] [3] >>

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…