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

 

начало

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

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

семинари ...

документи

как да ...

 

 

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

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


  • Subject: Re: lug-bg: c/cpp incr/decr
  • From: George Danchev <danchev@xxxxxxxxx>
  • Date: Tue, 18 Jan 2005 10:56:51 +0200

On Tuesday 18 January 2005 09:24, Nikolay Mitev wrote:
> Здрасти
>
> George Danchev wrote:
> >бърз въпрос: Разликата между x++ и ++x е безкрайно ясна (т.е. определя
> > дали променливата ще участва инкрементирана в израза, като тя самата при
> > всички случаи се инкрементира), но защо  когато участва и в лявата страна
> > на израза (втория случай) се получава един инкремент повече...
> >
> >#include <iostream>
> >using namespace std;
> >
> >int main()
> >{
> >   int a, b, x, y ;
> >
> >//
> >   a = b = x = y = 0 ;
> >
> >   a = x++ + ++x;
> >   b = ++y + y++;
> >
> >   cout << "a = x++ + ++x = " << a << "\n";
> >   cout << "b = ++y + y++ = " << b << "\n";
> >
> >//
> >   a = b = x = y = 0 ;
> >
> >   x = x++ + ++x;
> >   y = ++y + y++;
> >
> >   cout << "x = x++ + ++x = " << x << "\n";
> >   cout << "y = ++y + y++ = " << y << "\n";
> >
> >//
> >   a = b = x = y = 0 ;
> >
> >   cout << "x++ + ++x = x++ + ++x " << x++ + ++x << "\n";
> >   cout << "++y + y++ = ++y + y++ " << ++y + y++ << "\n";
> >
> >   return 0;
> >}
> >
> >./test
> >a = x++ + ++x = 2
> >b = ++y + y++ = 2
> >x = x++ + ++x = 3
> >y = ++y + y++ = 3
> >x++ + ++x = x++ + ++x 2
> >++y + y++ = ++y + y++ 2
> >
> >10x
>
> На това му се вика undefined behaviour. Компилатора има право да ти даде
> какъвто резултат му скимне. По стандарт нямаш право да променяш една и
> съща променлива без "sequence point" м/у двете промени, а ти правиш
> точно това в горните примери.

Мда, няма как да не се съглася с теб, тънка разлика, но съществена. Още 
повече, че в предния пример нито 2 нито 3 бяха отговорите (и наистина се 
получава къф да е резултат), а 1 както си му е реда защото имаме само едно 
инкрементиране участващо в израза. Т.е. требе да се перефразира до отделни 
променливи, но с еднакви стойности (което си е наша грижа как ще стане)

#include <iostream>
using namespace std;
int main(void)
{
   int a, b, x ;
   a = b = x = 0 ;
   x = a++ + ++b ;
   cout << "x = a++ + ++b = " << x << "\n";
   return 0;
}


Така това Хубаво, но след като всичко е синтактично правилно защо компила с 
-Wall не предупреждава за potential undefined behaviour след като го карам 
една и съща променлива да участва в израза хем преди инкремента и 
едновременно с това хем след инкремента без да имаме валиден край за 
statement (;) между тях (sequence poin) ? Това е извадка от по-сложна 
програма където нещата не са така явни и не е лесно да се track down-не, но 
се свежда до един такъв подводен камък. (операторите са други разбира се, 
щото инкремент + декремент няма много смисъл разбира се ;-)

-- 
pub 4096R/0E4BD0AB 2003-03-18 <danchev.fccf.net/key pgp.mit.edu>
fingerprint    1AE7 7C66 0A26 5BFF DF22 5D55 1C57 0C89 0E4B D0AB 
============================================================================
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.