George Danchev wrote:
On Tuesday 18 January 2005 09:24, Nikolay Mitev wrote:Най-вероятно е прекалено сложно за диагностициране. И comeau гък не казва. Имай предвид, че това е възможно най-тривиалния случай. Искам да видя компилатор, който ще успее да диагностицира:
Здрасти
George Danchev wrote:
На това му се вика undefined behaviour. Компилатора има право да ти дадебърз въпрос: Разликата между 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
какъвто резултат му скимне. По стандарт нямаш право да променяш една и
съща променлива без "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-не, но се свежда до един такъв подводен камък. (операторите са други разбира се, щото инкремент + декремент няма много смисъл разбира се ;-)
#include <iostream>
int main () { int a, &b = a;
a = 0; a = a++ + ++b;
std::cout << a << std::endl; }
или още по-объркани конструкции :-) Освен ако не го научи някой как се хвърля боб, или не започне да следи телевизия 2001, ще му бъде доста трудно. А и все пак да не забравяме, че "C gives you enough rope to shoot yourself in the foot" ;-)
И за пуританите, които ще напишат, че в C няма референси, да си кажа предварително, че знам :-)
И с указатели ще стане ;-)
cheers, face ============================================================================ 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 ============================================================================