1

Возможно баян. Но всем похуй.

Итак:

int i = 5;
i = ++i + ++i;

Кто решил - тот погромист.

2

16?

3

keal пишет:

16?

*О*_*О*

На чём считал???

Нет.

Думай дальше.

4

Тогда 12. *,...,*

п.с. Считал в уме. default/big_smile

5

Там 16 вообще быть не может.

12 - вероятно, но у меня другие ответы.

6

Ой... плюсики... default/shy

7

Купава пишет:

Ой... плюсики... default/shy

Продвинутые считают задачу так:

int i = 5;

i = --i + --i;

P.S.: Закомпиливаюсь на : Borland C++, MVC++, C#.

8

Апрель пишет:

Там 16 вообще быть не может.

12 - вероятно, но у меня другие ответы.

Про 16 я затупил немного. default/smile

9

У джаве дало 13. default/smile

10

Верёвки правильно, сцука, решил. Но это ответ на логику.

На компиляторах Борланда и Вижуал ответ - 14. Почему - хуй проссышь, видимо, приоритет конъюнкции стоит выше, хотя инкремент должен обсчитываться первым де-факто.

Глючный лисповский компил выдал 12. default/vom

11

keal пишет:

У джаве дало 13. default/smile

Теперь попробуй, это веселее.
int i = 5;
i = i++ + ++i;

увы без пробелов не компилится, ява увы просто не дает совсем уж извратить код.

12

srez пишет:

Теперь попробуй, это веселее.
int i = 5;
i = i++ + ++i;

Решал как

int i = 5;
i = ++i + i++ + ++i + i++ + ++i + i++;

Кто-нибудь сможет решить?

13 Отредактировано Апрель (01.06.2009 16:06:27)

believieverevki пишет:

Скорее всего это следствие такого представления:

++i;
++i;
i = i + i;

Если ты имеешь ввиду

int i=5;

i = ++i;
i = ++i;
i = i+i;

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

BС++/MVC++ первым инкремент обсчитывает.

14

Стандарт языка С++ ISO/IEC 14882 от 1998г. вводил понятие sequence point [1.9:7,11,16], между которыми (скалярная) переменная может быть изменена только один раз [5:4], и там как раз приведены примеры, что i=++i + 1; // the behavior is unspecified. Выражение ++i никоим образом sequence point не вводит (если только это не вызов функции "перегруженный operator++" для пользовательских типов, т.е. не в этом случае).

В редакции стандарта от 2003г. это unspecified behavior стало undefined, т.е. компилятор теперь имеет полное право вписать в переменную значение 42, вставить в программу код, форматирующий веник или взрывающий монитор.

С этого момента, собственно говоря, вопрос перестает быть техническим и становится "коммуникационным".

Так как выражение вида i = ++i + ++i; с точки зрения языка невалидно, нельзя однозначно судить о том, что же хотел сказать автор, написав это злополучное выражение. (А вы попробуйте подойти к прохожему на улице и сказать "абырвалг!". Что за этим последует, можно только гадать. Вполне возможно, что вам "отформатируют веник".)

15 Отредактировано srez (01.06.2009 16:23:28)

Апрель пишет:
srez пишет:

Теперь попробуй, это веселее.
int i = 5;
i = i++ + ++i;

Решал как

int i = 5;
i = ++i + i++ + ++i + i++ + ++i + i++;

Кто-нибудь сможет решить?

Фигня в том, что ява по стандарту не регулирует порядок в котором складывается несколько аргументов. А самое смешное, что даже скобки при этом игнорируются. То есть, результат может менятся в зависимости от компилятора. На практике, стандартный ява компилятор такое собирает справа налево.
11 + 9 + 9 + 7 + 7 + 5 = 48

16

Ну наизусть, конечно, не знаю, но кое-какими доками располагаю.

Вообще, задачка былинно-баянная, решал ещё в школе, там же о сиквенс поинтах и узнал.

17

srez пишет:
Апрель пишет:

int i = 5;
i = ++i + i++ + ++i + i++ + ++i + i++;

Кто-нибудь сможет решить?

Фигня в том, что ява по стандарту не регулирует порядок в котором складывается несколько аргументов. А самое смешное, что даже скобки при этом игнорируются. То есть, результат может менятся в зависимости от компилятора. На практике, стандартный ява компилятор такое собирает справа налево.
11 + 9 + 9 + 7 + 7 + 5 = 48

В решении BC++ ответ 51. Скобки, вроде, тоже игнорируются.

18

believieverevki пишет:

Копец, апрель знает стандарт С++ наизусть. Жесть. Странно, почему бы компилеру не выдать ошибку типа "неоднозначность"?

Неоднозначности нет, просто разные компиляторы по-разному воспринимают задачу.

19

srez пишет:

Теперь попробуй, это веселее.
int i = 5;
i = i++ + ++i;

12, и это логично.

srez пишет:

увы без пробелов не компилится, ява увы просто не дает совсем уж извратить код.

И это хорошо.

20

believieverevki пишет:
Апрель пишет:

Неоднозначности нет, просто разные компиляторы по-разному воспринимают задачу.

Когда каждый конкретный компилятор как-то эту задачу воспринимает, он может себе давать отчёт, что осуществил это восприятие не в соответствии со стандартом. Этот факт и должен заставлять его писать "неоднозначность".

Не совсем. Компиляторы BC++/MVC++ выдают ответ 14. J++/C# выдают 13. Стандарт разный.