On Tuesday 18 January 2005 11:29, Nikolay Mitev wrote: --cut-- > >Така това Хубаво, но след като всичко е синтактично правилно защо компила > > с -Wall не предупреждава за potential undefined behaviour след като го > > карам една и съща променлива да участва в израза хем преди инкремента и > > едновременно с това хем след инкремента без да имаме валиден край за > > statement (;) между тях (sequence poin) ? Това е извадка от по-сложна > > програма където нещата не са така явни и не е лесно да се track down-не, > > но се свежда до един такъв подводен камък. (операторите са други разбира > > се, щото инкремент + декремент няма много смисъл разбира се ;-) > > Най-вероятно е прекалено сложно за диагностициране. И comeau гък не > казва. Имай предвид, че това е възможно най-тривиалния случай. Искам да > видя компилатор, който ще успее да диагностицира: > > #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" ;-)
Така... добре g++ не го може още това с боба, но gcc явно има идея как се фърля/гледа на боб ;-) #include <stdio.h> int main() { int a, b, x, y ; a = b = x = y = 0 ; a = x++ + ++x ; b = ++y + y++ ; printf("a = x++ + ++x = %d\n", a ); printf("b = ++y + y++ = %d\n\n", b ); a = b = x = y = 0 ; x = x++ + ++x ; y = ++y + y++ ; printf("x = x++ + ++x = %d\n", x ); printf("y = y++ + ++y = %d\n\n", y ); a = b = x = y = 0 ; printf("x++ + ++x = %d\n", x++ + ++x ); printf("y++ + ++y = %d\n\n", ++y + y++ ); return 0; } [EMAIL PROTECTED]:~/myprogs/C$ gcc -o test test.c [EMAIL PROTECTED]:~/myprogs/C$ gcc -o test test.c -Wall test.c: In function `main': test.c:9: warning: operation on `x' may be undefined test.c:10: warning: operation on `y' may be undefined test.c:17: warning: operation on `x' may be undefined test.c:17: warning: operation on `x' may be undefined test.c:18: warning: operation on `y' may be undefined test.c:18: warning: operation on `y' may be undefined test.c:25: warning: operation on `x' may be undefined test.c:26: warning: operation on `y' may be undefined сега съм доволен ;-) -- 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 ============================================================================