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
============================================================================
|