Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » префиксный инкремент С

Ответить
Настройки темы
префиксный инкремент С

Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить 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

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


mrcnn
Не понял, шутите Вы или тестируете народ...
О! Я Вам личкой отвечу, а остальные пусть думают

Отправлено: 17:04, 10-01-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить 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++)!

Цитирую последнию строчу из раздела о инкременте и декримете из своей книги:
Цитата:
"Следует просто избегать таких запутанных ситуаций и не смешивать разные формы операторов в одном выражении".
[1]Д.А. Клюшин, "Полный курс С++", Диалектика 2004.

Отправлено: 18:32, 10-01-2005 | #3


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


hasherfrog
Спасибо. Свою ошибку понял

-------
Ehhh.. what's up, doc?..


Отправлено: 22:06, 10-01-2005 | #4


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


mrcnn
Не за что Прикольный вопрос, я уже и забыл такие штучки. Надо будет кого-нибудь "опросить". Приберегу для людей, которые в анкетах пишут "Отлично владею С/С++". Хе-хе-хе...

el_cool
Верный ход мыслей, всё правильно, только как-то уж очень запутанно. Это Вы из книги всё взяли? Или вольный пересказ, своими словами? Если из книги - я Вам сочувствую. Изучать С по такому "шероховатому для глаза" учебнику - то ещё удовольствие.

Отправлено: 22:57, 10-01-2005 | #5


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Да, кстати насчёт
Цитата:
СТАНДАРТОМ С++ ЭТИ ПРАВИЛА НЕ РЕГЛАМЕНТИРУЮТСЯ
Что-то вызывает сомнения. Где-то что-то я такое читал, там ещё про оптимизацию кода было... Но это - раньше. Сейчас-то стандарты есть?

Отправлено: 23:04, 10-01-2005 | #6


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


В убенике приводиться только код (без комментариев) и затем: "ну что ж, все логично" . А в довершении всего в каждом примере ужаснейшие опечатки, вплоть до пропуска строк. Я уж думал, не умышлинно ли это сделано? Чтобы скомпилить приходилось пример из книги модифицировать. Почти каждый. Я этот учебник забросил и перешел на С. Прата "Язык программирования С++. Лекции и упражнения". Он и потолще будет

А стандарта действительно вроде нет.

Отправлено: 23:51, 10-01-2005 | #7


Ветеран


Сообщения: 1404
Благодарности: 135

Профиль | Отправить PM | Цитировать


hasherfrog
Я тут еще подумал. То, что вы написали не объясняет, почему
y = ++x + ++x + ++x (== 10) (A)
и
y = ++x + ++x + ++x + ++x (==15) (B)

В соответствии с вашим объяснением в случае A должно быть 12, а не 10, в случае B 20 а не 15
Даже напротив тут подходит больше мое объяснение, однако оно не избавляет от проблемы появления лишней единицы.

-------
Ehhh.. what's up, doc?..


Отправлено: 01:00, 11-01-2005 | #8


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить 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
Благодарности: 135

Профиль | Отправить PM | Цитировать


hasherfrog
cl 12.00.8804
При конфигурации Debug и компиляции из IDE выдается 6 10 15
При конфигурации Release - 6 12 20
Почему разница в результатах?

-------
Ehhh.. what's up, doc?..


Отправлено: 07:49, 11-01-2005 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » префиксный инкремент С

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено




 
Переход