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

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

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

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

04.08.2008, 06:48. Просмотров 8347. Ответов 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
orangemouse
Сообщений: n/a
04.08.2008, 14:15 #16
спасибо огромное) правильный ответ 14...)))) спасибо вам большое пребольшое)))
Lord_Voodoo
Супер-модератор
8590 / 2205 / 61
Регистрация: 07.03.2007
Сообщений: 10,960
Завершенные тесты: 1
04.08.2008, 14:16 #17
ну вообще это можно было и самому проверить... разве сложно написать прогу на 3 строчки
0
Vialls
1 / 1 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 14:33 #18
Цитата Сообщение от WooDooMan666 Посмотреть сообщение
все зависит от компилятора... видимо в c# они переосмыслили логику разбора выражений... может что-то завязано на приоритетах, просто беседа идет все-таки про с++ ну или с на крайний случай, про другие языки не буду спорить в силу некомпетентности...
Окей, просто посути хоть как-то, но родсвеные языки и я всегда думал, что результат одинаков. Зато будем знать теперь
0
Lord_Voodoo
Супер-модератор
8590 / 2205 / 61
Регистрация: 07.03.2007
Сообщений: 10,960
Завершенные тесты: 1
04.08.2008, 14:42 #19
Цитата Сообщение от Vialls Посмотреть сообщение
Окей, просто посути хоть как-то, но родсвеные языки и я всегда думал, что результат одинаков. Зато будем знать теперь
век живи - век учись...
0
Somebody
2789 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 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 - меньше возможностей запутаться
0
Lord_Voodoo
Супер-модератор
8590 / 2205 / 61
Регистрация: 07.03.2007
Сообщений: 10,960
Завершенные тесты: 1
04.08.2008, 16:16 #21
на счет приоритетов, вы не правы... они имеются в любом случае, а вообще такого рода записи - дурной тон программирования, ум за разум заходит... brainfack какой-то выходит, а не си
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
04.08.2008, 17:07 #22
Не нужно писать так только потому,что можно так писать. Нужно всегда точно знать,что делает код. Такие примеры хороши как задачи,но не дай бог увидеть
такое в своем рабочем коде...
0
Vialls
1 / 1 / 0
Регистрация: 02.08.2008
Сообщений: 40
04.08.2008, 17:53 #23
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Не нужно писать так только потому,что можно так писать. Нужно всегда точно знать,что делает код. Такие примеры хороши как задачи,но не дай бог увидеть
такое в своем рабочем коде...
Поэтому надо сидеть и разбираться в этом, ибо это удобней И интересно
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,375
04.08.2008, 22:41 #24
Цитата Сообщение от orangemouse Посмотреть сообщение
i=5;
j=(++i) + (++i):
Чему равно j?;
18. Или "Hello, World!". Или 256. Или - форматирование диска C:. Что больше понравится - выбирай на вкус.
Стандарт 5/4 говорит, что такой код приводит к неопределенному поведению (unspecified/undefined behavior) программы. Под "неопределенным поведением" же можно понимать все, что угодно, вплоть до форматирования жесткого диска, - Стандарт (1.3.12) не накладывает никаких ограничений.
И не нужно медитировать над компиляторами, приоритетами и прочим. Нет Стандарта, кроме Стандарта, и Страуструп - пророк его.
0
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
04.08.2008, 23:05 #25
всё по порядочку
i==5
для начала выполняются действаия в скобках,
++i сначала инкрементит i, и только потом возвращает его, сразу после этого выполняется вторая скобка и мы имеем:
i==7;
j=i+i;
тоесть j=14
а уж в других языках просто приоритет не такой у операций(я ориентировался на приоритет C++)
0
Somebody
2789 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
05.08.2008, 12:04 #26
Цитата Сообщение от Spo1ler Посмотреть сообщение
++i сначала инкрементит i, и только потом возвращает его
Нет, не так.
++i возвращает i+1, а в какой момент времени (не обязательно сразу) она то ли инкрементит саму i, то ли пишет в неё вычисленное значение, это не определено.
0
Vialls
1 / 1 / 0
Регистрация: 02.08.2008
Сообщений: 40
05.08.2008, 17:36 #27
Работает все, как описал Spo1ler. Только значение в C++ не возвращается (не сохраняется в выражении), а просто перед началом вычисления выражения два раза инкремируется значение i и в итоге получается i+i (т.е. 7+7). В случае с постфиксным - инкремент происходит после вычисления выражения, и получается 10.

Добавлено через 5 часов 16 минут
Хех. Щас писал прогу, и понял в чем фишка в C#. В C# получается 14 в том случае, если инкремент заключен в скобки. То есть, когда он в скобках - значение сохраняется, когда нет - не сохраняется. Т.е. выражение "++i + ++i" вернет 13, когда "(++i) + (++i)" вернет 14.
0
Счастливчик
19 / 18 / 0
Регистрация: 04.08.2008
Сообщений: 31
07.08.2008, 20:45 #28
А меня интересует следующая запись:
q++ = p.

Что она означает? Переменной q присваивается значение p, затем она инкрементируется?
И что было бы если имела место запись ++q=p?

Добавлено через 2 минуты
Ещё вопрос. Если компиллятор доходит до какой то строки, то он читает её целиком, или двигается слева направо?
0
XuTPbIu_MuHTAu
Эксперт С++
2226 / 741 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
07.08.2008, 20:47 #29
Цитата Сообщение от Счастливчик Посмотреть сообщение
А меня интересует следующая запись:
q++ = p.
Эту запись не пропустит компилятор. С сообщением,что левый операнд оператора "=" должен быть "l-value" (c) MS studio. Таким кодом,ты пытаешься непойми чему присвоить p. Слева должен быть адрес переменной(вернее,переменная,у которой где-то есть адрес ) ,а фактически там находится то,что возвращает оператор ++.
0
Счастливчик
19 / 18 / 0
Регистрация: 04.08.2008
Сообщений: 31
07.08.2008, 23:46 #30
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Эту запись не пропустит компилятор. С сообщением,что левый операнд оператора "=" должен быть "l-value" (c) MS studio. Таким кодом,ты пытаешься непойми чему присвоить p. Слева должен быть адрес переменной(вернее,переменная,у которой где-то есть адрес ) ,а фактически там находится то,что возвращает оператор ++.
Я просто решил не усложнять запись(и сделал это от своего невежества). В книге по которой я занимаюсь, есть прога где определены следующие переменные
char *q и сhar *p, и инструкция *q++ = *p, если честно, я и не понял что она обозначает.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2008, 23:46
Привет! Вот еще темы с ответами:

Использование инкремента(Декремента) - 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 << "Operand 2=2"; for...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
07.08.2008, 23:46
Закрытая тема Создать тему
Опции темы

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