LINUX.ORG.RU
ФорумTalks

Где я ошибся?


0

0

Сидел читал баш-орг.
<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

Что я неправильно понимаю?
★★★★★

Я к тому, откуда еще один инкримент приплелся?

ManJak ★★★★★
() автор топика

В книге Молчанова есть пример с i+++++j, ни в gcc, ни в MSVC++ он не собирается.

seiken ★★★★★
()

ИМХО:

первый инкремент возвращает ссылку на i, второй инкремент возвращает ссылку на i => произошло два инкремента. имеем две ссылки на одну и ту же переменную => 2*i == 14

generatorglukoff ★★
()
Ответ на: комментарий от cthulhu

>С такой логикой код i = ++i + ++i + ++i должен давать 24, чего на практике не наблюдается=)

Оно же в две операции выполняется.

true
()

Хм. ИМХО:
Перед рассчетом выражения он выполняет все инкременты, т.е. получается
(++i + ++i) он выполняет вначале инкременты, потом считает.
в случае же если ++i + ++i + ++i получается 22 по такой логике что
((++i + ++i) + ++i) т.е. в первых скобках 14 (i=7), во внешние переходит результат первых скобок 14 и складывается с еще одним инкрементом (i было равно 7, а стало 8) получается 22.

n0uk
()

А у меня вот так:
$ 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
$

edw1n ★★
()
Ответ на: комментарий от ManJak

Отдизассемблил:

movl $5, -8(%ebp)
incl -8(%ebp)
incl -8(%ebp)
movl -8(%ebp), %eax
addl %eax, -8(%ebp)

stassats ★★★★
()
Ответ на: комментарий от n0uk

Кстати, да, я что-то провтыкал. Ты очень прав. Преинкремент нах...

Кстати, по сходной причине i = i++ + i++ дает 12 а i = i++ + i++ i++ - 18. Преинкремент сначала увеличивает, потом возвращает, а постинкремент наоборот.

cthulhu ★☆
()
Ответ на: комментарий от ManJak

Дык, оно сначала два инкремента подряд делает, а потом уже складывает 7 + 7.

Если написать i++ + i++; то он сначала сложит, а потом два инкремента подряд.

stassats ★★★★
()
Ответ на: комментарий от stassats

Спасибо большое.
Хотя, в правилах и приоритетах этого не встречал.
Может забыл.

Спасибо большое!

ManJak ★★★★★
() автор топика
Ответ на: комментарий от dima3351

Может не достиг просветления сразу.
Я говорю, что не программер, а просто интересно стало =(

ЗЫ
Тем более: "Со всеми бывает".

ManJak ★★★★★
() автор топика
Ответ на: комментарий от ManJak

Ну в k&r написато, что и ++ и -- приоритет выше, чем у +/-;

stassats ★★★★
()
Ответ на: комментарий от bugmaker

> пойти в 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. 

Убило :))))))))))))))))

edw1n ★★
()

Когда-то тут был опрос на профессиональную тему, и большинство назвали себя программистами. Видимо, почти все из них нагло соврали, иначе тут не было бы никакого обсуждения. Вопрос -- классика собеседования, ответ искать в Стандарте по ключевым словам sequence point.

Relan ★★★★★
()

Полчаса втыкал в топик, никак не мог врубиться.

Наконец дошло. Как я понимаю, все дело в том, что ++х возвращает не число, а ссылку на х, так? Это так и должно быть, или это фича gcc?

Кстати, tcc выдает 13.

anonymous
()
Ответ на: комментарий от Relan

Этот вопрос уже всем изрядно надоел, и те, кто знает, либо ленятся отвечать, либо загадочно вещают про Standard и Sequence Points. Остальные думают, что это посты не в тему и обсуждают загадочное влияние оптимизации на ссылки в С.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

Ну все расписано. Даже вывод gcc -S приведен, для полного понимания, чо он тама делает.

stassats ★★★★
()

вот за такие фокусы С и не любят!

DemonZLa
()
Ответ на: комментарий от edw1n

> int i = 2;
i = i++;

>on several compilers. Some gave i the value 2, some gave 3, but one gave 4.

и эти сишники запрещают нам ковырятся пальцем в носу!

anonymous
()
Ответ на: комментарий от anonymous

Хм....
Прикольно!

Спасибо всем за объяснения.
Что-то понял, что-то еще прочту.

ManJak ★★★★★
() автор топика

а я где ошибся?

#include <stdio.h>

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

а почему тут получается 22, а не 24 в таком случае?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.