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 14:54:15 +0200
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;
}
danchev@debian:~/myprogs/C$ gcc -o test test.c
danchev@debian:~/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
============================================================================
|