Сидел читал баш-орг.
<cite>
KoloDen
Привет, я общительный пацан, люблю поболтать, особенно с классными девченками. Но, чтобы поговорить со мной, ответьте на простую задачку анти-спам бота. Вот она:
int i = 5;
i = ++i + ++i;
Вопрос: Чему равно i?
Stefmania
14
KoloDen
Гы. Признайся, ты не девченка, а 40-летний одмин, да?
</cite>
Но в моем понимании (я никогда не называл себя программистом, но с С знаком слегка):
(5+1) + (6+1) == 13
Я никогда не говорил, что программист, но вроде очевидно.
Проверил!
$ vi test.c
#include <stdio.h>
main() {
int i = 5;
i = ++i + ++i;
printf("%i\n", i);
}
$ cc test.c
$ ./a.out
14
Что я неправильно понимаю?
первый инкремент возвращает ссылку на i, второй инкремент возвращает ссылку на i => произошло два инкремента. имеем две ссылки на одну и ту же переменную => 2*i == 14
Хм. ИМХО:
Перед рассчетом выражения он выполняет все инкременты, т.е. получается
(++i + ++i) он выполняет вначале инкременты, потом считает.
в случае же если ++i + ++i + ++i получается 22 по такой логике что
((++i + ++i) + ++i) т.е. в первых скобках 14 (i=7), во внешние переходит результат первых скобок 14 и складывается с еще одним инкрементом (i было равно 7, а стало 8) получается 22.
А у меня вот так:
$ vi test.java
public class test {
public static void main(String[] args) {
int i = 5;
i = (++i + ++i);
System.out.println(i);
}
}
$ javac test.java
$ java test
13
$
Кстати, да, я что-то провтыкал. Ты очень прав. Преинкремент нах...
Кстати, по сходной причине i = i++ + i++ дает 12 а i = i++ + i++ i++ - 18. Преинкремент сначала увеличивает, потом возвращает, а постинкремент наоборот.
> пойти в FAQ за подробностями.
3.3: I've experimented with the code
int i = 2;
i = i++;
on several compilers. Some gave i the value 2, some gave 3, but one gave 4. I know the behavior is undefined, but how could it give 4?
Because i is 2, the loop is executed twice.
Убило :))))))))))))))))
Когда-то тут был опрос на профессиональную тему, и большинство назвали себя программистами. Видимо, почти все из них нагло соврали, иначе тут не было бы никакого обсуждения. Вопрос -- классика собеседования, ответ искать в Стандарте по ключевым словам sequence point.
Этот вопрос уже всем изрядно надоел, и те, кто знает, либо ленятся отвечать, либо загадочно вещают про Standard и Sequence Points. Остальные думают, что это посты не в тему и обсуждают загадочное влияние оптимизации на ссылки в С.