Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 67, средняя оценка - 4.87
orangemouse
Сообщений: n/a
#1

Секреты инкремента - C++

04.08.2008, 06:48. Просмотров 8385. Ответов 32
Метки нет (Все метки)

Пожалуйста!!! помогите! Умоляю!

i=5;
j=(++i) + (++i):
Чему равно j?;

пожалуйста обьясните как это решается, ну или просто ответ скаите???:huh:
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2008, 06:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Секреты инкремента (C++):

Перегрузка инкремента - C++
Допустим, что некий класс имеет в наличии методы пре(и пост-)фиксного инкрементов. Date& Date::operator++(); Date...

Особенности инкремента - C++
Здравствуйте!Возник вопрос касательно операции инкремента(++) допутим у нас есть код #include <iostream> int main() { ...

Перегрузка инкремента ++ - C++
Не понимаю как вызвать перегрузку инкремента: void operator ++( int m ); в функции main,какой синтаксис. Я в main циклично ввожу числа и...

Перегрузка операции инкремента - C++
Как известно, постинкремент возвращает r-value, а преинкремент - l-value. То есть: ++(++x); // допустимо (x++)++; // ошибка...

Перегрузка операторов инкремента - C++
Мне надо перегрузить инкримент, я пытался сделать постфиксный и + . Я вродебы сделал, но оно почему-то не выводит.( prog.h #pragma once...

Переопределение оператора инкремента - C++
В теле класса "Сlocks" описали: Clocks& operator ++(); // Prefix increment operator. Clocks operator ++(int); // Postfix...

32
Vialls
1 / 1 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 08:35 #2
13
0
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
04.08.2008, 09:54 #3
будет 14, потому что сначала произойдет дважды инкремент i, т.к. у него приоритет выше, а потом уже производится само сложение...
0
Vialls
1 / 1 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 10:00 #4
(5+1)+(6+1)=13, я так и считал, или я вас не правильно понял?

Добавлено через 1 минуту
Щас на C# попробывал, результат - 13
Код
            int i = 5;
            int j = (++i) + (++i);
            Console.WriteLine(j.ToString());
            Console.ReadLine();
0
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
04.08.2008, 10:09 #5
проверил в трех компилерах, дает 14,
т.к. при постфиксной операции сначала выполняется инкремент, а потом суммирование и присвоение, в префиксной форме - будет 10, т.к. сначала идет суммирование и присвоение, а потом уже инкремент...
Код
#include <conio.h>
#include <iostream.h>
int main()
{
 clrscr();
 int i = 5, j = 0, k = 0;
 j = (++i) + (++i);
 i = 5; // это меня и сбило с толку
 k = (i++) + (i++);
 cout<<j<<endl;
 cout<<k<<endl;
 getch();
 return 0;
}
0
Vialls
1 / 1 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 10:25 #6
Понял, просто C# и C++ по разному выполняют инкремент, хотя я думал всегда, что одинаково. В C# сначала выполняется первый инкремент и возвращается значение 6, потом второй и возвращается 7, и они складываются. А в C++, как я понял, результат инкремента, просто отражается на переменной, т.е. предыдущий код идентичен этому:
Код
int i = 5;
i++;
i++;
int j = i + i;
0
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
04.08.2008, 10:58 #7
Vialls, так погоди, что у тебя не так, ведь инкрементируется одна и та же переменная, как это она может запомнить свои предыдущие состояния? она сначала становится 6, потом 7, ну и 7+7 = 14, но не 13
0
MAcK
Комбайнёр
1561 / 659 / 21
Регистрация: 27.05.2008
Сообщений: 2,535
04.08.2008, 11:06 #8
мозно сделать так
j = i + i++;
0
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
04.08.2008, 11:18 #9
Цитата Сообщение от MAcK Посмотреть сообщение
мозно сделать так
j = i + i++;
будет 10
0
MAcK
Комбайнёр
1561 / 659 / 21
Регистрация: 27.05.2008
Сообщений: 2,535
04.08.2008, 11:29 #10
j = i + ++i;
вот так
0
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
04.08.2008, 11:31 #11
Цитата Сообщение от MAcK Посмотреть сообщение
j = i + ++i;
вот так
будет 12, может вы просто сами потестируете разные варианты, тем более, что вопрос стоял не в том, как получить 13...
0
Vialls
1 / 1 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 11:59 #12
Цитата Сообщение от WooDooMan666 Посмотреть сообщение
Vialls, так погоди, что у тебя не так, ведь инкрементируется одна и та же переменная, как это она может запомнить свои предыдущие состояния? она сначала становится 6, потом 7, ну и 7+7 = 14, но не 13
Щас вычитал в книжке по C#. В общем в C# префиксные операции инкремента выполняются до вычисления выражения, а постфиксные после. Это одно отличае C# от C++. Второе, это то, что значение каким-то образом сохраняются. Возможно операция инкремента в C# возвращает значение, подобно функции, как это проверить я не знаю. В общем в C# при выполнении выражения (++i)+(++i) происходит примерно следующее:
Код
            int i = 5;
            int a = ++i; // Равно 6
            int b = ++i; // Равно 7
            int j = a + b; // Равно 13
А при префиксном инкременте, т.е. (i++) + (i++), вообще результат 11. Как тут происходит дело я не пойму никак. Тем более при условии, что при данном виде инкремента, переменная i должна инкремироваться после выполнения выражение, т.е. по идеи должно получиться 10, а переменная i после этого должна быть равна 6. Никто ничего не знает на этот счет?
0
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
04.08.2008, 12:15 #13
ну префикс и постфикс работают одинаково, что в с++ и c#, твой пример дает отличный результат, потому что инкремент ты в разные переменные пишешь, а реально делается дважды инкримент, а потом уже идет суммирование в постфиксе, в префиксе же все идет иначе, сначало суммирование, а потом уже инкремент... в обоих случаях будет i = 7, но результат будет 14 и 10 соответственно... хотя я c# несильно знаком, может они и как-то сохраняют в такого рода выражениях предыдущее значение, все зависит от компилятора...
0
Vialls
1 / 1 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 13:16 #14
Цитата Сообщение от WooDooMan666 Посмотреть сообщение
ну префикс и постфикс работают одинаково, что в с++ и c#, твой пример дает отличный результат, потому что инкремент ты в разные переменные пишешь, а реально делается дважды инкримент, а потом уже идет суммирование в постфиксе, в префиксе же все идет иначе, сначало суммирование, а потом уже инкремент... в обоих случаях будет i = 7, но результат будет 14 и 10 соответственно... хотя я c# несильно знаком, может они и как-то сохраняют в такого рода выражениях предыдущее значение, все зависит от компилятора...
Сомневаюсь, что в C# и C++ они работают одинаково. Это уже обусловленно тем, что они возвращают свое значение выражению, а не делают это как в C++. На счет кода, с двумя разными переменными - ниже код и скриншот. На счет i = 7 - не могу не согласится . С результатом 11, при постфиксном инкременте вообще не пойму в чем дело
Код:
Код
        static void Main(string[] args)
        {
            int i = 5;
            int j = (++i) + (++i);
            Console.WriteLine("Префиксный инкремент == {0}, i == {1}", j.ToString(), i.ToString());
            i = 5;
            j = (i++) + (i++);
            Console.WriteLine("Постфиксный инкремент == {0}, i == {1}", j.ToString(), i.ToString());
            Console.ReadLine();
        }
Результат прикрепил.
0
Миниатюры
Секреты инкремента  
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
04.08.2008, 13:21 #15
все зависит от компилятора... видимо в c# они переосмыслили логику разбора выражений... может что-то завязано на приоритетах, просто беседа идет все-таки про с++ ну или с на крайний случай, про другие языки не буду спорить в силу некомпетентности...
0
04.08.2008, 13:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2008, 13:21
Привет! Вот еще темы с ответами:

Использование инкремента(Декремента) - C++
Есть три кнопки и три индикатора(лампочки). Если нажимаю кнопку-1 тогда включается лампочка нажимаю еще раз выключается. Если по одному...

Переопределение операции инкремента - C++
Добрый вечер! Задачка простая и кода с примерами в сети куча, но меня волнует вопрос почему компилятор ругается на мой код: Myclass...

Ассоциативность инкремента декремента - C++
Всем привет. Вот такую табличку недавно нашел - http://ru.cppreference.com/w/cpp/language/operator_precedence Почему префиксный...

Операция инкремента и декримента на С++ - C++
Смотрите, написал я прогаммку в Ц++, вот отрывок от неё: ...int main () { int a,b,c,k; a=100;b=2;c=4; cout &lt;&lt; &quot;Operand 2=2&quot;; for...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru