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

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

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

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

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

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

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

пожалуйста обьясните как это решается, ну или просто ответ скаите???:huh:
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2008, 06:48     Секреты инкремента
Посмотрите здесь:

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

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

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

Операторы инкремента и декремента - C++
Создайте в классе Circle префиксный и постфиксный операторы инкремента и декремента, воздействующие только на член-данное радиус itsRadius.

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vialls
1 / 1 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 08:35     Секреты инкремента #2
13
Lord_Voodoo
Супер-модератор
8580 / 2180 / 61
Регистрация: 07.03.2007
Сообщений: 10,864
Завершенные тесты: 1
04.08.2008, 09:54     Секреты инкремента #3
будет 14, потому что сначала произойдет дважды инкремент i, т.к. у него приоритет выше, а потом уже производится само сложение...
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();
Lord_Voodoo
Супер-модератор
8580 / 2180 / 61
Регистрация: 07.03.2007
Сообщений: 10,864
Завершенные тесты: 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;
}
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;
Lord_Voodoo
Супер-модератор
8580 / 2180 / 61
Регистрация: 07.03.2007
Сообщений: 10,864
Завершенные тесты: 1
04.08.2008, 10:58     Секреты инкремента #7
Vialls, так погоди, что у тебя не так, ведь инкрементируется одна и та же переменная, как это она может запомнить свои предыдущие состояния? она сначала становится 6, потом 7, ну и 7+7 = 14, но не 13
MAcK
Комбайнёр
1558 / 655 / 21
Регистрация: 27.05.2008
Сообщений: 2,535
04.08.2008, 11:06     Секреты инкремента #8
мозно сделать так
j = i + i++;
Lord_Voodoo
Супер-модератор
8580 / 2180 / 61
Регистрация: 07.03.2007
Сообщений: 10,864
Завершенные тесты: 1
04.08.2008, 11:18     Секреты инкремента #9
Цитата Сообщение от MAcK Посмотреть сообщение
мозно сделать так
j = i + i++;
будет 10
MAcK
Комбайнёр
1558 / 655 / 21
Регистрация: 27.05.2008
Сообщений: 2,535
04.08.2008, 11:29     Секреты инкремента #10
j = i + ++i;
вот так
Lord_Voodoo
Супер-модератор
8580 / 2180 / 61
Регистрация: 07.03.2007
Сообщений: 10,864
Завершенные тесты: 1
04.08.2008, 11:31     Секреты инкремента #11
Цитата Сообщение от MAcK Посмотреть сообщение
j = i + ++i;
вот так
будет 12, может вы просто сами потестируете разные варианты, тем более, что вопрос стоял не в том, как получить 13...
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. Никто ничего не знает на этот счет?
Lord_Voodoo
Супер-модератор
8580 / 2180 / 61
Регистрация: 07.03.2007
Сообщений: 10,864
Завершенные тесты: 1
04.08.2008, 12:15     Секреты инкремента #13
ну префикс и постфикс работают одинаково, что в с++ и c#, твой пример дает отличный результат, потому что инкремент ты в разные переменные пишешь, а реально делается дважды инкримент, а потом уже идет суммирование в постфиксе, в префиксе же все идет иначе, сначало суммирование, а потом уже инкремент... в обоих случаях будет i = 7, но результат будет 14 и 10 соответственно... хотя я c# несильно знаком, может они и как-то сохраняют в такого рода выражениях предыдущее значение, все зависит от компилятора...
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();
        }
Результат прикрепил.
Миниатюры
Секреты инкремента  
Lord_Voodoo
Супер-модератор
8580 / 2180 / 61
Регистрация: 07.03.2007
Сообщений: 10,864
Завершенные тесты: 1
04.08.2008, 13:21     Секреты инкремента #15
все зависит от компилятора... видимо в c# они переосмыслили логику разбора выражений... может что-то завязано на приоритетах, просто беседа идет все-таки про с++ ну или с на крайний случай, про другие языки не буду спорить в силу некомпетентности...
orangemouse
Сообщений: n/a
04.08.2008, 14:15     Секреты инкремента #16
спасибо огромное) правильный ответ 14...)))) спасибо вам большое пребольшое)))
Lord_Voodoo
Супер-модератор
8580 / 2180 / 61
Регистрация: 07.03.2007
Сообщений: 10,864
Завершенные тесты: 1
04.08.2008, 14:16     Секреты инкремента #17
ну вообще это можно было и самому проверить... разве сложно написать прогу на 3 строчки
Vialls
1 / 1 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 14:33     Секреты инкремента #18
Цитата Сообщение от WooDooMan666 Посмотреть сообщение
все зависит от компилятора... видимо в c# они переосмыслили логику разбора выражений... может что-то завязано на приоритетах, просто беседа идет все-таки про с++ ну или с на крайний случай, про другие языки не буду спорить в силу некомпетентности...
Окей, просто посути хоть как-то, но родсвеные языки и я всегда думал, что результат одинаков. Зато будем знать теперь
Lord_Voodoo
Супер-модератор
8580 / 2180 / 61
Регистрация: 07.03.2007
Сообщений: 10,864
Завершенные тесты: 1
04.08.2008, 14:42     Секреты инкремента #19
Цитата Сообщение от Vialls Посмотреть сообщение
Окей, просто посути хоть как-то, но родсвеные языки и я всегда думал, что результат одинаков. Зато будем знать теперь
век живи - век учись...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2008, 16:08     Секреты инкремента
Еще ссылки по теме:

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

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

Перегрузка префиксного инкремента - C++
Как перегрузить префиксальный инкремент? class Horse{ private: int x,y; public: Horse(void); void setX(int); ...

Оператор перегрузки инкремента - C++
Добрый день. Мне нужна оценка кода. Правильно - ли я все сделал? Подскажите пожалуйста. если что не так. /*Создать класс с перегрузкой...

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


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

Или воспользуйтесь поиском по форуму:
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 1
04.08.2008, 16:08     Секреты инкремента #20
j=(++i)+(++i); j=(i++)+(i++); q=w[q++]; q=w[++q]; и т. д.
Приоритетов в таком случае нет никаких, всё зависит от компилятора.
По-моему, все следующие варианты вычисления j=(++i)+(++i) при i==5 соответствуют стандарту
--1--
Каждое ++i увеличивает i и использует полученное значение в выражении.
Результат - j=13 i=7
--2--
Каждое ++i увеличивает i, в выражении используется значение, полученное после того, как ВСЕ ++i увеличат i.
Результат - j=14 i=7
--3--
Каждое ++i использует в выражении i+1 при этом само i увеличивается (каждым i++) после вычисления выражения.
Результат - j=12 i=7
--4--
Каждое ++i использует в выражении i+1, при этом после вычисления выражения не увеличивается i, а просто в i записывается (каждый i++) вычисленное i+1.
Результат - j=12 i=6
PS Хорошо живётся в Pascal'е/Delphi - меньше возможностей запутаться
Yandex
Объявления
04.08.2008, 16:08     Секреты инкремента
Закрытая тема Создать тему
Опции темы

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