RE: [ILUG] gcc optimisation weirdness?

From: Kenn Humborg (kenn at domain bluetree.ie)
Date: Wed 10 May 2000 - 17:50:34 IST


> gcc seems to do weird things to the following:
>
> int input, frequency[9];
>
> //frequency[] initialised to 0.
>
> do {
> scanf("%d", &input);
> if (input > 0 && input < 11) {
> //point 1
> (frequency[input-1])++;
> //point 2
> }
> } while (input);
>
> if i compile with -O2 or -O3 it works as i expect it to, but if i compile
> with "gcc -o test test.c" then:
>
> it works correctly for digits 0 thru 9, however if i enter 10 it goes
> wrong: at point 1 input == 10, at point 2 input == 11!

Very odd... I'd expect that the statement

   (f[i])++

would not be legal. Is (var) a legal lvalue? Aha... info gcc
(under the C Extensions section) says that

   File: gcc.info, Node: Lvalues, Next: Conditionals, Prev: Typeof, Up:
C Extensions

   Generalized Lvalues
   ===================

      Compound expressions, conditional expressions and casts are allowed
   as lvalues provided their operands are lvalues. This means that you
   can take their addresses or store values into them.

      Standard C++ allows compound expressions and conditional expressions
   as lvalues, and permits casts to reference type, so use of this
   extension is deprecated for C++ code.

      For example, a compound expression can be assigned, provided the last
   expression in the sequence is an lvalue. These two expressions are
   equivalent:

        (a, b) += 5
        a, (b += 5)

      Similarly, the address of the compound expression can be taken.
   These two expressions are equivalent:

        &(a, b)
        a, &b

      A conditional expression is a valid lvalue if its type is not void
   and the true and false branches are both valid lvalues. For example,
   these two expressions are equivalent:

        (a ? b : c) = 5
        (a ? b = 5 : (c = 5))

Hmmm...

> PS: is there anyway to initialise an array at declaration time, rather
> than iterate thru the array and set each element manually? eg something
> like: int array[9]=0;

You mean like:

   int array[9]={0, 1, 2, 3, 4, 3, 2, 1, 0};

That is standard C. GCC also has some extensions that allow
you to do fancied stuff with initializers. Take a look at
the C and C++ Extensions sections in the GCC info pages.

Later,
Kenn



This archive was generated by hypermail 2.1.6 : Thu 06 Feb 2003 - 13:06:05 GMT