vakito
11-05-2007 10:48
Как себя занять? Правильно, читаем башорг.
Задача.
i=5;
i = ++i+ ++i;
i=?

Ява выдает 13, С++ 14, камрад Xirax говорит, что php выдает 13.
Вопрос: почему разный результат?
это [ кто знает? ]
Комментарии:
Haibane
Разная очерёдность выполнения. Если не ошибаюсь, это есть в любом современном учебнике программирования, или справочнике по языку.

Камрад
Потому что Ява и Пхп обрабатывают строки сразу и последовательно, а Си обрабатывает их целиком, и у него приоритет инкримента выше чем приоритет сложения.
Вот от этого и разный результат.

Камрад
cpcat davvol
а сколько тогда будет i++ + i++?

Haibane
В сях вроде 12, в скриптах - не знаю

Камрад
cpcat
в яве 11

Haibane
Бля.

int main()
{
int i = 5;
int n = 5;

i = ++i+ ++i;
printf("i = %d\n", i);

n = n++ + n++;
printf("n = %d\n\n", n);

}

$ cc test.c
$ ./a.out
i = 14
n = 12

11-05-2007 17:58
Камрад
Господа, не ругайтесь. В С (и, скорее всего, в С++ тоже) есть такое понятие как sequence point. Инкременты и сложение к ним не относятся, так что результат зависит от трактовки конкретным компилятором.

11-05-2007 19:51
не_как_все
а если ++i взять в скобки, то одинаковый ответ будет?

11-05-2007 20:17
Камрад
Zanokra
Нет, поскольку не определен точно момент времени, когда переменной i будет присваиваться значение i+1. Замени ++i на (i+=1) для наглядности.

C99, 6.5.3.1, Prefix increment and decrement operators:
The expression ++E is equivalent to (E+=1).

C99, 6.5.16, Assignment operators:
The side effect of updating the stored value of the left operand shall occur between the previous and the next sequence point.

Варианты ответов, для разных компиляторов и разных вариантов оптимизации: 6,7,12,13,14.

11-05-2007 20:51
не_как_все
Anafay что-то не пойму. как не определен?
i=5
i=(++i)+ (++i)
=(6)+(7)
=13

как иначе?
какая я глупая

11-05-2007 21:08
Камрад
Zanokra
При использовании ++i значение этого выражения равно i+1. Но когда это будет записано в i, сказать нельзя. Смотри разные трактовки:

Результат 14:
i=(i+=1), (i+=1), (i+i);

Результат 13:
i=(c=i+1), (i=c), (i+=1), (i+c);

Результат 12:
i=(c=i+1), (d=i+1), (i=c), (i=d), (c+d);

Результат 6:
i=(c=i+1), (d=i+1), (i=d), (i+i);
i=c;

Результат 7:
i=(c=i+1), (i=c), (d=i+1), (i+i);
i=d;

Камрад
Anafay
интересно, вариант на 6 и на 7 где-нибудь реально используется?
жаль в абапе нет таких фишек...

11-05-2007 21:13
не_как_все
Anafay аа. я забыла, что это i и присваивается.) тогда понятно.

Камрад
Zanokra
это не важно.
если напишешь в сях j = ++i+ ++i, результат все равно будет 14.

11-05-2007 21:17
не_как_все
а зачем вообще ++, если такие сложности? лучше лишнюю строчку написать)

11-05-2007 21:18
Камрад
vakito
интересно, вариант на 6 и на 7 где-нибудь реально используется?
Gnu и иже с ними?
Там полно софта, который собирается только конкретной версией компилятора и только с определенными опциями.

жаль в абапе нет таких фишек...
А теперь представь себе, что тебе надо саппортить код, в котором полно подобного. Даже простой переезд на новую версию компилятора представляет собой засаду

11-05-2007 21:20
Камрад
vakito
j = ++i+ ++i

j=++i + ++k;

Камрад
Zanokra
я видел, как пишут классные коды именно с этими фишками. Только разобраться потом невозможно, но работает!
Anafay
Gnu и иже с ними?
жаль проверить мне негде. но в возможность присваивания результата инкремента после сложения верится с трудом...
Даже простой переезд на новую версию компилятора
как же мы по шестерке облизываемся....
а засад с переездом с версии на версию и так вагон

11-05-2007 21:23
не_как_все
vakito
если напишешь в сях j = ++i+ ++i, результат все равно будет 14.
ну да, 13 не получится

Камрад
Anafay
j=++i + ++k;
ну тогда да, конечно. но это уже неинтересный случай.

Ваш комментарий:
Гость []
[смайлики сайта]
Автоматическое распознавание URL
Не преобразовывать смайлики
Cкрыть комментарий
Закрыть