orangemouse
|
|
1 | |
Секреты инкремента04.08.2008, 06:48. Показов 11111. Ответов 32
Метки нет (Все метки)
Пожалуйста!!! помогите! Умоляю!
i=5; j=(++i) + (++i): Чему равно j?; пожалуйста обьясните как это решается, ну или просто ответ скаите???:huh: |
04.08.2008, 06:48 | |
Ответы с готовыми решениями:
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
|
Комбайнёр
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 |
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 |
будет 12, может вы просто сами потестируете разные варианты, тем более, что вопрос стоял не в том, как получить 13...
0
|
2 / 2 / 0
Регистрация: 02.08.2008
Сообщений: 40
|
|
04.08.2008, 11:59 | 12 |
Щас вычитал в книжке по C#. В общем в C# префиксные операции инкремента выполняются до вычисления выражения, а постфиксные после. Это одно отличае C# от C++. Второе, это то, что значение каким-то образом сохраняются. Возможно операция инкремента в C# возвращает значение, подобно функции, как это проверить я не знаю. В общем в C# при выполнении выражения (++i)+(++i) происходит примерно следующее:
Код
int i = 5; int a = ++i; // Равно 6 int b = ++i; // Равно 7 int j = a + b; // Равно 13
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 |
Сомневаюсь, что в 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 |
Окей, просто посути хоть как-то, но родсвеные языки и я всегда думал, что результат одинаков. Зато будем знать теперь
0
|
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
|
|
04.08.2008, 14:42 | 19 |
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 | |
04.08.2008, 16:08 | |
Помогаю со студенческими работами здесь
20
Оператор перегрузки инкремента Операторы инкремента и декремента Перегрузка операции инкремента Использование инкремента(Декремента) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |