orangemouse
1

Секреты инкремента

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

Author24 — интернет-сервис помощи студентам
Пожалуйста!!! помогите! Умоляю!

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

пожалуйста обьясните как это решается, ну или просто ответ скаите???:huh:
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2008, 06:48
Ответы с готовыми решениями:

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

Сброс инкремента
Случайным образом выводятся числа в диапазоне от 0 до 100, при этом указывается ширина выборки, то...

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

Особенности инкремента
Здравствуйте!Возник вопрос касательно операции инкремента(++) допутим у нас есть код #include...

32
2 / 2 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 08:35 2
13
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 09:54 3
будет 14, потому что сначала произойдет дважды инкремент i, т.к. у него приоритет выше, а потом уже производится само сложение...
0
2 / 2 / 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
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
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
2 / 2 / 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
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 10:58 7
Vialls, так погоди, что у тебя не так, ведь инкрементируется одна и та же переменная, как это она может запомнить свои предыдущие состояния? она сначала становится 6, потом 7, ну и 7+7 = 14, но не 13
0
Комбайнёр
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
04.08.2008, 11:06 8
мозно сделать так
j = i + i++;
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 11:18 9
Цитата Сообщение от MAcK Посмотреть сообщение
мозно сделать так
j = i + i++;
будет 10
0
Комбайнёр
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
04.08.2008, 11:29 10
j = i + ++i;
вот так
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 11:31 11
Цитата Сообщение от MAcK Посмотреть сообщение
j = i + ++i;
вот так
будет 12, может вы просто сами потестируете разные варианты, тем более, что вопрос стоял не в том, как получить 13...
0
2 / 2 / 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. Никто ничего не знает на этот счет?
1
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 12:15 13
ну префикс и постфикс работают одинаково, что в с++ и c#, твой пример дает отличный результат, потому что инкремент ты в разные переменные пишешь, а реально делается дважды инкримент, а потом уже идет суммирование в постфиксе, в префиксе же все идет иначе, сначало суммирование, а потом уже инкремент... в обоих случаях будет i = 7, но результат будет 14 и 10 соответственно... хотя я c# несильно знаком, может они и как-то сохраняют в такого рода выражениях предыдущее значение, все зависит от компилятора...
0
2 / 2 / 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
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 13:21 15
все зависит от компилятора... видимо в c# они переосмыслили логику разбора выражений... может что-то завязано на приоритетах, просто беседа идет все-таки про с++ ну или с на крайний случай, про другие языки не буду спорить в силу некомпетентности...
0
orangemouse
04.08.2008, 14:15 16
спасибо огромное) правильный ответ 14...)))) спасибо вам большое пребольшое)))
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 14:16 17
ну вообще это можно было и самому проверить... разве сложно написать прогу на 3 строчки
0
2 / 2 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 14:33 18
Цитата Сообщение от WooDooMan666 Посмотреть сообщение
все зависит от компилятора... видимо в c# они переосмыслили логику разбора выражений... может что-то завязано на приоритетах, просто беседа идет все-таки про с++ ну или с на крайний случай, про другие языки не буду спорить в силу некомпетентности...
Окей, просто посути хоть как-то, но родсвеные языки и я всегда думал, что результат одинаков. Зато будем знать теперь
0
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 14:42 19
Цитата Сообщение от Vialls Посмотреть сообщение
Окей, просто посути хоть как-то, но родсвеные языки и я всегда думал, что результат одинаков. Зато будем знать теперь
век живи - век учись...
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
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 - меньше возможностей запутаться
0
04.08.2008, 16:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.08.2008, 16:08
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru