Официальный сайт студ.городка НГТУ
Программирование и БД » [C] странный результат 

#1  14.05.07 22:26

[C] странный результат

имеется прога:

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

вопрос: почему i=14?

Offline

#2  14.05.07 22:34

Re: [C] странный результат

С Bash.org.ru :)
Построй дерево разбора или обратную польскую запись: +(++i)(++i). Т.е. сначало произойдут два инкримента, а потом сложение: 7 + 7 = ? ;)

Offline

#3  14.05.07 22:34

rzk
Профиль

Re: [C] странный результат

потому что  вот так распознает

Код::

i = ++i++ + i;

Offline

#4  14.05.07 22:39

Re: [C] странный результат

хм ... и так и так верно ... где истина? )

Offline

#5  14.05.07 22:41

Re: [C] странный результат

rzk написал(а):

потому что  вот так распознает

вот если бы вот так распозновал, как раз бы и было 13((5+1)+6+1) , efferson уже дал правильный ответ :)

Offline

#6  14.05.07 22:58

Re: [C] странный результат

как так ...

i = ++i++ + i;
     6 | 7  + 7

не так разве ?
ведь когда последнее сложение идет то и=7 ведь уже ... после инкремента

Offline

#7  14.05.07 23:06

Re: [C] странный результат

rzk, балалайка - тоже сначала так подумал :) Говорю же - дерево разбора:
            +
          /   \
       ++i  ++i
Трансляция злая вещчь :)

Offline

#8  14.05.07 23:07

Re: [C] странный результат

злая конечно но мозг имеет свойство интерпретировать по своему ... как ему легче воспринимать ) а уж как это делает кумпулятор )

Offline

#9  14.05.07 23:07

Re: [C] странный результат

На C/C++ потому что UB.
Программа пытается модифицировать одну переменную трижды между двумя точками следования.

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

На Java и C# здесь всегда будет 13.

Offline

#10  14.05.07 23:08

Re: [C] странный результат

СнегаН, неа - тоже было бы 14. Ячейка памяти то одна ;)

Offline

#11  14.05.07 23:10

Re: [C] странный результат

utug, самый большой недостаток C/C++ - его недетерминированость. Посему стоит юзать только те компиляторы, которые соответствуют ANSI :)

Offline

#12  14.05.07 23:15

Re: [C] странный результат

efferson написал(а):

Посему стоит юзать только те компиляторы, которые соответствуют ANSI

смотрим стандарт:
5
4. Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified.53) Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full expression; otherwise the behavior is undefined. [Example:
i = v[i++]; // the behavior is unspecified
i = 7, i++, i++; // i becomes 9
i = ++i + 1; // the behavior is unspecified
i = i + 1; // the value of i is incremented

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

Offline

#13  14.05.07 23:40

Re: [C] странный результат

efferson написал(а):

СнегаН, неа - тоже было бы 14. Ячейка памяти то одна ;)

скомпилил на J IDEA... 13
причём, съедает только так: i=++i+ ++i; //с пробелом между плюсами

Исправлено kvazimodo (14.05.07 23:44)

Offline

#14  14.05.07 23:43

Re: [C] странный результат

выпьем за чудо компиляцию

Offline

#15  14.05.07 23:50

Re: [C] странный результат

Borland съедает также только с пробелом.

Offline

#16  15.05.07 00:07

rzk
Профиль

Re: [C] странный результат

kvazimodo написал(а):

скомпилил на J IDEA... 13
причём, съедает только так: i=++i+ ++i; //с пробелом между плюсами

на с# тоже воспринимает только i=++i+ ++i; - ответ 13;

Offline

#17  15.05.07 00:44

Re: [C] странный результат

потому что для Java и C# здесь все чисто!
учите порядок выполнения операций!

Offline

#18  15.05.07 13:38

Re: [C] странный результат

utug, хм... не знал...

Offline

#19  15.05.07 18:07

Re: [C] странный результат

Компилятор тут рулит )

Offline

#20  15.05.07 21:54

Re: [C] странный результат

У меня на MSVC получилось два разных результата сделать:

Код: с++:

	int i=5;
	i=++i+ + +i;
	printf("%d", i); //12

Код: с++:

	int i=5;
	i=++i+ ++i;
	printf("%d", i); //14


Объясните непросвещенному - что к чему?

Исправлено Zaic (15.05.07 21:55)

Offline

#21  15.05.07 21:55

Re: [C] странный результат

в пробелах дело )

Offline

#22  15.05.07 21:58

Re: [C] странный результат

А если написать

Код: С++:

	int i=5;
	i= + + i + + + i;
	printf("%d", i);

то вообще 10 получится...
В общем, много плюсов надо избегать.

Offline

#23  16.05.07 18:13

Re: [C] странный результат

вообщем не надо извращаться все таки это не Перл
есть сомнения - раздели операции на две.

Offline

#24  20.06.07 02:26

Re: [C] странный результат

жжоте!!!! )))))) пацталом)

Offline

#25  23.06.07 20:17

Re: [C] странный результат

Автор, купи себе книгу Подбельского С++

Offline

Программирование и БД » [C] странный результат 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.038 сек.
Выполнено 14 запросов.