Increment/decrement operator bugs

Andrew Thomas Pinski pinskia@gmail.com
Thu Sep 25 17:53:00 GMT 2008



Sent from my iPhone

On Sep 25, 2008, at 10:39 AM, "Miguel A. Quintans" <miguel.quintans@uah.es 
 > wrote:

> Hello
>
> The result of  an expression using pre-decrement or pre-increment  
> such as:
>       y = x * n * --n;

Try turning on warnings. That is -Wsquence-points. The above is  
specified behavior as there are squence points between the increment  
of n and the other access of n.

>
> gives different results in a few cases where x is placed before or  
> after the rest, or when its value is 1 or not. Please run the  
> program attached where a comment indicates what we think works  
> wrong. We obtain:
>
> 1.- 16
> 2.- 16
> 3.- 16
> 4.- 40
> 5.- 20
> 6.- 16
> 7.- 40
> 8.- 32
> 1.- 36
> 2.- 36
> 3.- 36
> 4.- 60
> 5.- 30
> 6.- 36
> 7.- 60
> 8.- 72
>
> In contrast, the results we get running it in a AIX Computer with  
> the native compiler (IBM XL C/C++ Enterprise Edition for AIX, V9.0  
> Version: 09.00.0000.0000) is what we expected:
>
> 1.- 20
> 2.- 20
> 3.- 20
> 4.- 40
> 5.- 20
> 6.- 20
> 7.- 40
> 8.- 40
> 1.- 30
> 2.- 30
> 3.- 30
> 4.- 60
> 5.- 30
> 6.- 30
> 7.- 60
> 8.- 60
>
> We have experienced this issue in several versions of the gcc  
> compiler (the ones distributed under fedora cores 6, 7, 8, knoppix  
> 5.0.1 and also in the windows Dev-c++ 4.9.9.2 package compiler)  
> obtaining the same results, that we think are (obviously) wrong.
>
> We remain expectant of any comment from you.
>
> Best regards
>
> Miguel Ángel Quintáns & Virginia Escuder
> Professors at the Universidad de Alcalá
> Madrid
> Spain
>
> #include int main () { int x=2; int p=1; 	int n=5; int y = n * --n;  
> printf ("1.- %d\n",y); // wrong n=5; y = 1 * n * --n; printf ("2.- %d 
> \n",y); // wrong n=5; 	y = n * --n * 1; printf ("3.- %d\n",y); //  
> wrong n=5; y = 2 * n * --n; printf ("4.- %d\n",y); n=5; y = p * n *  
> --n; printf ("5.- %d\n",y); n=5; y = n * --n * p; printf ("6.- %d 
> \n",y); // wrong n=5; y = x * n * --n; printf ("7.- %d\n",y); n=5; y  
> = n * --n * x; printf ("8.- %d\n",y); // wrong n=5; y = n * ++n;  
> printf ("1.- %d\n",y); // wrong n=5; y = 1 * n * ++n; printf ("2.- %d 
> \n",y); // wrong n=5; y = n * ++n * 1; printf ("3.- %d\n",y); //  
> wrong n=5; y = 2 * n * ++n; printf ("4.- %d\n",y); n=5; y = p * n * + 
> +n; printf ("5.- %d\n",y); n=5; y = n * ++n * p; printf ("6.- %d 
> \n",y); // wrong n=5; y = x * n * ++n; printf ("7.- %d\n",y); n=5; y  
> = n * ++n * x; printf ("8.- %d\n",y); // wrong }



More information about the Gcc-bugs mailing list