префиксный инкремент С

Аватара пользователя
mrcnn

префиксный инкремент С

Сообщение mrcnn »

Код:

Код: Выделить всё

#include 
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

Почему?

Где ошибка в моих рассуждениях?
Аватара пользователя
hasherfrog

Re: префиксный инкремент С

Сообщение hasherfrog »

mrcnn

Не понял, шутите Вы или тестируете народ...

О! Я Вам личкой отвечу, а остальные пусть думают
Аватара пользователя
el_cool

Re: префиксный инкремент С

Сообщение el_cool »

Программа же транслируется на ассемблер. А там уже на низком уровне Optimizing Compiler находит способ экономить ячейки. Если компилить без оптимезации результат вполне может измениться.
Аватара пользователя
el_cool

Re: префиксный инкремент С

Сообщение el_cool »

Я в программировании совсем новечек, но в той книге [1], по которой я учу С++, этот вопрос рассматривается.



Ты просто ошибся в приоритетах.

Если: y = ++x + ++x;

То не: (y = ++x) + ++x;

А: y = (++x) + (++x);



Но есть тонкий момент. В выражении y = (++x) * (++x) результат будет не 6 а 9!!!

2---------3

// test.cpp

#include

using namespace std;



void main()

{

int x = 1, y;

y = (++x) * (++x); // обрати внимание, выполнятеся в таком порядке !



cout
Аватара пользователя
mrcnn

Re: префиксный инкремент С

Сообщение mrcnn »

hasherfrog

Спасибо. Свою ошибку понял
Аватара пользователя
hasherfrog

Re: префиксный инкремент С

Сообщение hasherfrog »

mrcnn

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



el_cool

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

Re: префиксный инкремент С

Сообщение hasherfrog »

Да, кстати насчёт


Цитата:



СТАНДАРТОМ С++ ЭТИ ПРАВИЛА НЕ РЕГЛАМЕНТИРУЮТСЯ



Что-то вызывает сомнения. Где-то что-то я такое читал, там ещё про оптимизацию кода было... Но это - раньше. Сейчас-то стандарты есть?
Аватара пользователя
el_cool

Re: префиксный инкремент С

Сообщение el_cool »

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



А стандарта действительно вроде нет.
Аватара пользователя
mrcnn

Re: префиксный инкремент С

Сообщение mrcnn »

hasherfrog

Я тут еще подумал. То, что вы написали не объясняет, почему

y = ++x + ++x + ++x (== 10) (A)

и

y = ++x + ++x + ++x + ++x (==15) (B)



В соответствии с вашим объяснением в случае A должно быть 12, а не 10, в случае B 20 а не 15

Даже напротив тут подходит больше мое объяснение, однако оно не избавляет от проблемы появления лишней единицы.
Аватара пользователя
hasherfrog

Re: префиксный инкремент С

Сообщение hasherfrog »

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

Изображение





А вы чем?
Ответить

Вернуться в «Программирование и базы данных»