Linux-Bulgaria.ORG
навигация

 

начало

пощенски списък

архив на групата

семинари ...

документи

как да ...

 

 

Предишно писмо Следващо писмо Предишно по тема Следващо по тема По Дата По тема (thread)

Re: lug-bg: c/cpp incr/decr


  • Subject: Re: lug-bg: c/cpp incr/decr
  • From: vladev@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (Valeri Vladev)
  • Date: Fri, 21 Jan 2005 12:28:51 +0200
  • Mail-followup-to: vladev@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, lug-bg@xxxxxxxxxxxxxxxxxx

On Thu, 20 Jan 2005, George Danchev wrote:

> 
> всичко това е много хубаво ;-) , но аз бих те попитал защо след като смяташ 
> x = x++ + (++x + a); или x = x++ + ++x; (все тая) и a=x=0; 

Само забелязвам, че си съгласен с това, че ако а = 0
изразите "x = x++ + (++x + a)" и "x = x++ + ++x" са
еквивалентни. Долу ще стане въпрос за това.


> и имаш x++ (в дясната страна) тогава резултата след завършване на израза не е 
> ти се получава 1 ? Аз ще отчета само x++ (че е инкремент на x след израза) и 
> съм готов с отговора ;-) няма защо да натрупвам резултата от сметките... (za 
> tfa компила с -Wall казва недефинирано поведение с което ще се съгласят и в 
> древна Елада ;-)
> 
> напиши го като a = b++ + ++c, дай им нули на всичките и ще получиш единица 
> както и да го смяташ ;-) , т.е. в резултата от израза участва само един 
> инкремент.
> 
> Ето още един лек пример:

Да оставим за сега printf на мира.

> > Проблима е, че ползва за променливата от ляво и това което изчислява
> > дясно една и съща памет! Сигурно е някаква оптимизация защото
> > променливата е една и съща.
> 
> няма как компилатора да използва временна променлива за стойност която искаш 
> хем да участва преди да е инкрементирана в израза, хем след като е 
> инкрементирана да участва в израза и накрая този резултат да не противоречи 
> на следствието от пост-инкрементирането (x++, което участва в израза). Това е 
> математически невъзможно/недефинирано ;-)

Не става въпрос за временна променлива на х, става въпрос за това,
че комилатора трябва да ползва временна променлива за изчисленията си
от дясната страна. 

> > Ако при изчисляването на израза се използва временна променлива
> > всичко щеше да е ОК.
> > Такъв израз "x = x++ + ++x" нямам представа кой би си помислил да
> > използва 
> 
> в този точно вид не (x = x++ + ++x), но може инцидентно да достигнеш до такова 
> животно (без да искаш;) ... А иначе c = a++ + ++b е окай отсекъде, което може 
> би се е имало в предвид. Т.е. с един израз да получим 
> сбора от двете плюс единица (a+b+1) и всяко поотделно увеличено е единица (a+1 
> и b+1 ... да се пишат 3 израза е грубо ;-) 
> (Да, онова за въжето го знаем ;-) 
> 
> > но ако е семантично верен трябва да дава верен резултат. 
> 
> Семантично е неверен (виж горе)
> т.е., след операция от вида x = x++ + ++ x, кое ще е стойността на x, това 
> което се е натрупало от изчислението или просто следствието от x++ което е x 
> +1 след изчисляване на израза, да но след изчислението на израза имаме друго 
> натрупване като резултат.... Та не мой така механично да се счита ;-)

След операция от вида f = (накакъв израз) това което стои от ляво
получава стойността на това което е изчислено от дясно.

Виж как се получават два различни резултата с два еднакви
израза:
"x++ + ++x + a" е еквивалентно на "a + x++ + ++x"

#include <stdio.h>
int
main (void)
{
register int x = 0;
register int a = 0;

    printf("x = %d, a = %d\n", x, a);
    x = x++ + ++x + a;
    printf("x++ + ++x + a = %d\n",x);
    x = 0;
    printf("x = %d, a = %d\n", x, a);
    x = a + x++ + ++x;
    printf("a + x++ + ++x = %d\n",x);
    return (0);
}

Изхода на това е:
x = 0, a = 0
x++ + ++x + a = 3
x = 0, a = 0
a + x++ + ++x = 2




-- 
Valeri Vladev <tolio@xxxxxxxxxxx>
PGP-Key-ID: 0x9CB166CD ICQ #235683218
Registered Linux User #362712
/**********               **********/

============================================================================
A mail-list of Linux Users Group - Bulgaria (bulgarian linuxers).
http://www.linux-bulgaria.org - Hosted by Internet Group Ltd. - Stara Zagora
To unsubscribe: http://www.linux-bulgaria.org/public/mail_list.html
============================================================================



 

наши приятели

 

линукс за българи
http://linux-bg.org

FSA-BG
http://fsa-bg.org

OpenFest
http://openfest.org

FreeBSD BG
http://bg-freebsd.org

KDE-BG
http://kde.fsa-bg.org/

Gnome-BG
http://gnome.cult.bg/

проект OpenFMI
http://openfmi.net

NetField Forum
http://netField.ludost.net/forum/

 

 

Linux-Bulgaria.ORG

Mailing list messages are © Copyright their authors.