Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/62: Рейтинг темы: голосов - 62, средняя оценка - 4.79
orangemouse

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

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

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

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

пожалуйста обьясните как это решается, ну или просто ответ скаите???:huh:
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.08.2008, 06:48
Ответы с готовыми решениями:

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

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

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

32
 Аватар для Vialls
2 / 2 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 08:35
13
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 09:54
будет 14, потому что сначала произойдет дважды инкремент i, т.к. у него приоритет выше, а потом уже производится само сложение...
0
 Аватар для Vialls
2 / 2 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 10:00
(5+1)+(6+1)=13, я так и считал, или я вас не правильно понял?

Добавлено через 1 минуту
Щас на C# попробывал, результат - 13
Code
1
2
3
4
            int i = 5;
            int j = (++i) + (++i);
            Console.WriteLine(j.ToString());
            Console.ReadLine();
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 10:09
проверил в трех компилерах, дает 14,
т.к. при постфиксной операции сначала выполняется инкремент, а потом суммирование и присвоение, в префиксной форме - будет 10, т.к. сначала идет суммирование и присвоение, а потом уже инкремент...
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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
2 / 2 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 10:25
Понял, просто C# и C++ по разному выполняют инкремент, хотя я думал всегда, что одинаково. В C# сначала выполняется первый инкремент и возвращается значение 6, потом второй и возвращается 7, и они складываются. А в C++, как я понял, результат инкремента, просто отражается на переменной, т.е. предыдущий код идентичен этому:
Code
1
2
3
4
int i = 5;
i++;
i++;
int j = i + i;
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 10:58
Vialls, так погоди, что у тебя не так, ведь инкрементируется одна и та же переменная, как это она может запомнить свои предыдущие состояния? она сначала становится 6, потом 7, ну и 7+7 = 14, но не 13
0
Комбайнёр
 Аватар для MAcK
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
04.08.2008, 11:06
мозно сделать так
j = i + i++;
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 11:18
Цитата Сообщение от MAcK Посмотреть сообщение
мозно сделать так
j = i + i++;
будет 10
0
Комбайнёр
 Аватар для MAcK
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
04.08.2008, 11:29
j = i + ++i;
вот так
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 11:31
Цитата Сообщение от MAcK Посмотреть сообщение
j = i + ++i;
вот так
будет 12, может вы просто сами потестируете разные варианты, тем более, что вопрос стоял не в том, как получить 13...
0
 Аватар для Vialls
2 / 2 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 11:59
Цитата Сообщение от WooDooMan666 Посмотреть сообщение
Vialls, так погоди, что у тебя не так, ведь инкрементируется одна и та же переменная, как это она может запомнить свои предыдущие состояния? она сначала становится 6, потом 7, ну и 7+7 = 14, но не 13
Щас вычитал в книжке по C#. В общем в C# префиксные операции инкремента выполняются до вычисления выражения, а постфиксные после. Это одно отличае C# от C++. Второе, это то, что значение каким-то образом сохраняются. Возможно операция инкремента в C# возвращает значение, подобно функции, как это проверить я не знаю. В общем в C# при выполнении выражения (++i)+(++i) происходит примерно следующее:
Code
1
2
3
4
            int i = 5;
            int a = ++i; // Равно 6
            int b = ++i; // Равно 7
            int j = a + b; // Равно 13
А при префиксном инкременте, т.е. (i++) + (i++), вообще результат 11. Как тут происходит дело я не пойму никак. Тем более при условии, что при данном виде инкремента, переменная i должна инкремироваться после выполнения выражение, т.е. по идеи должно получиться 10, а переменная i после этого должна быть равна 6. Никто ничего не знает на этот счет?
1
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 12:15
ну префикс и постфикс работают одинаково, что в с++ и c#, твой пример дает отличный результат, потому что инкремент ты в разные переменные пишешь, а реально делается дважды инкримент, а потом уже идет суммирование в постфиксе, в префиксе же все идет иначе, сначало суммирование, а потом уже инкремент... в обоих случаях будет i = 7, но результат будет 14 и 10 соответственно... хотя я c# несильно знаком, может они и как-то сохраняют в такого рода выражениях предыдущее значение, все зависит от компилятора...
0
 Аватар для Vialls
2 / 2 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 13:16
Цитата Сообщение от WooDooMan666 Посмотреть сообщение
ну префикс и постфикс работают одинаково, что в с++ и c#, твой пример дает отличный результат, потому что инкремент ты в разные переменные пишешь, а реально делается дважды инкримент, а потом уже идет суммирование в постфиксе, в префиксе же все идет иначе, сначало суммирование, а потом уже инкремент... в обоих случаях будет i = 7, но результат будет 14 и 10 соответственно... хотя я c# несильно знаком, может они и как-то сохраняют в такого рода выражениях предыдущее значение, все зависит от компилятора...
Сомневаюсь, что в C# и C++ они работают одинаково. Это уже обусловленно тем, что они возвращают свое значение выражению, а не делают это как в C++. На счет кода, с двумя разными переменными - ниже код и скриншот. На счет i = 7 - не могу не согласится . С результатом 11, при постфиксном инкременте вообще не пойму в чем дело
Код:
Code
1
2
3
4
5
6
7
8
9
10
        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
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 13:21
все зависит от компилятора... видимо в c# они переосмыслили логику разбора выражений... может что-то завязано на приоритетах, просто беседа идет все-таки про с++ ну или с на крайний случай, про другие языки не буду спорить в силу некомпетентности...
0
orangemouse
04.08.2008, 14:15
спасибо огромное) правильный ответ 14...)))) спасибо вам большое пребольшое)))
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 14:16
ну вообще это можно было и самому проверить... разве сложно написать прогу на 3 строчки
0
 Аватар для Vialls
2 / 2 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 14:33
Цитата Сообщение от WooDooMan666 Посмотреть сообщение
все зависит от компилятора... видимо в c# они переосмыслили логику разбора выражений... может что-то завязано на приоритетах, просто беседа идет все-таки про с++ ну или с на крайний случай, про другие языки не буду спорить в силу некомпетентности...
Окей, просто посути хоть как-то, но родсвеные языки и я всегда думал, что результат одинаков. Зато будем знать теперь
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.08.2008, 14:42
Цитата Сообщение от Vialls Посмотреть сообщение
Окей, просто посути хоть как-то, но родсвеные языки и я всегда думал, что результат одинаков. Зато будем знать теперь
век живи - век учись...
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
04.08.2008, 16:08
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.08.2008, 16:08
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru