|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » префиксный инкремент С |
|
|
префиксный инкремент С
|
Ветеран Сообщения: 1404 |
Профиль | Отправить PM | Цитировать #include <stdio.h> void main(){ int x,y; x=1; y=0; y = ++x + ++x ; printf("Y-%d , X-%d\n",y,x); } в выражении y = ++x + ++x ; после первого ++x x становится равным 2 и прибавляется к У, равному 0, таким образом y=0+2=2 после второго ++x x становится равным 3 и прибавляется к Y, равному 2, таким образом y=2+3=5 Однако после выполнения программа выдает что Y=6 Почему? Где ошибка в моих рассуждениях? |
|
Отправлено: 14:38, 10-01-2005 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать mrcnn
Не понял, шутите Вы или тестируете народ... О! Я Вам личкой отвечу, а остальные пусть думают |
Отправлено: 17:04, 10-01-2005 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать Я в программировании совсем новечек, но в той книге [1], по которой я учу С++, этот вопрос рассматривается.
Ты просто ошибся в приоритетах. Если: y = ++x + ++x; То не: (y = ++x) + ++x; А: y = (++x) + (++x); Но есть тонкий момент. В выражении y = (++x) * (++x) результат будет не 6 а 9!!! 2---------3 // test.cpp #include <iostream> using namespace std; void main() { int x = 1, y; y = (++x) * (++x); // обрати внимание, выполнятеся в таком порядке ! cout << "y = " << y << ' ' << "x = " << x; cin.get(); } // результат: y = 9 x = 3 // КАК ПРОИСХОДИТ ВЫЧИСЛЕНИЕ // Если x = 1, и надо x + 3, то знчение из х копируется в ячейку tmp, затем // 3 добавляется к тому, что в ячейке tmp, и в конце то, что в tmp перезаписывается // поверх x. // tmp = ++x; // x = 2, tmp = 2 // tmp = ++x; // x = 3, tmp = 3 // y = tmp * tmp; так как х = 3, то, х * х = 9. То есть, умножаются два окончательных значения х! Более того, СТАНДАРТОМ С++ ЭТИ ПРАВИЛА НЕ РЕГЛАМЕНТИРУЮТСЯ и в одном компиляторе может быть 6 (Turbo C++ 3.0), а в другом - 9 (Visual C++ 6.0 и g++)! Цитирую последнию строчу из раздела о инкременте и декримете из своей книги: Цитата:
|
|
Отправлено: 18:32, 10-01-2005 | #3 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать hasherfrog
Спасибо. Свою ошибку понял |
------- Отправлено: 22:06, 10-01-2005 | #4 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать mrcnn
Не за что Прикольный вопрос, я уже и забыл такие штучки. Надо будет кого-нибудь "опросить". Приберегу для людей, которые в анкетах пишут "Отлично владею С/С++". Хе-хе-хе... el_cool Верный ход мыслей, всё правильно, только как-то уж очень запутанно. Это Вы из книги всё взяли? Или вольный пересказ, своими словами? Если из книги - я Вам сочувствую. Изучать С по такому "шероховатому для глаза" учебнику - то ещё удовольствие. |
|
Отправлено: 22:57, 10-01-2005 | #5 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Да, кстати насчёт
Цитата:
|
|
Отправлено: 23:04, 10-01-2005 | #6 |
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать В убенике приводиться только код (без комментариев) и затем: "ну что ж, все логично" . А в довершении всего в каждом примере ужаснейшие опечатки, вплоть до пропуска строк. Я уж думал, не умышлинно ли это сделано? Чтобы скомпилить приходилось пример из книги модифицировать. Почти каждый. Я этот учебник забросил и перешел на С. Прата "Язык программирования С++. Лекции и упражнения". Он и потолще будет
А стандарта действительно вроде нет. |
Отправлено: 23:51, 10-01-2005 | #7 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать hasherfrog
Я тут еще подумал. То, что вы написали не объясняет, почему y = ++x + ++x + ++x (== 10) (A) и y = ++x + ++x + ++x + ++x (==15) (B) В соответствии с вашим объяснением в случае A должно быть 12, а не 10, в случае B 20 а не 15 Даже напротив тут подходит больше мое объяснение, однако оно не избавляет от проблемы появления лишней единицы. |
------- Отправлено: 01:00, 11-01-2005 | #8 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать mrcnn
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3052 for 80x86 Copyright (C) Microsoft Corporation 1984-2002. All rights reserved. 6, 12, 20 А вы чем? |
Отправлено: 01:28, 11-01-2005 | #9 |
Ветеран Сообщения: 1404
|
Профиль | Отправить PM | Цитировать hasherfrog
cl 12.00.8804 При конфигурации Debug и компиляции из IDE выдается 6 10 15 При конфигурации Release - 6 12 20 Почему разница в результатах? |
------- Отправлено: 07:49, 11-01-2005 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
|