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