Velocity Reviews > C++ > Order of evaluation: int a=1, b=a+1;

# Order of evaluation: int a=1, b=a+1;

Derek
Guest
Posts: n/a

 12-09-2003
Am I correct in assuming there is no guaranteed order of
initialization for a and b in the statement

int a=1, b=a+1;

In other words, b=a+1 could be evaluated before a=1, right?

Ron Natalie
Guest
Posts: n/a

 12-09-2003

"Derek" <(E-Mail Removed)> wrote in message news:br4vbe\$27oo9t\$(E-Mail Removed)-berlin.de...
> Am I correct in assuming there is no guaranteed order of
> initialization for a and b in the statement
>
> int a=1, b=a+1;
>
> In other words, b=a+1 could be evaluated before a=1, right?
>

Well, they are initialzed in sequence. You have to realize you don't b=a+1 isn't an
expression, it's another init-declearator. If it were treated as an independent entity,
you wouldn't even be assured that a was declared in the stuff to the right of the ,.

Read the first few paragraphs of chapter 8 of the standard.

Dan W.
Guest
Posts: n/a

 12-09-2003
On Tue, 9 Dec 2003 12:04:45 -0500, "Derek" <(E-Mail Removed)> wrote:

>Am I correct in assuming there is no guaranteed order of
>initialization for a and b in the statement
>
>int a=1, b=a+1;
>
>In other words, b=a+1 could be evaluated before a=1, right?
>

That's right; no guarantee.

When I have constants that depend on other constants spread about, I
try to write functions instead. The Eiffel language has a neat
solution for this, called 'once' functions, which only compute a
result and evaluate arguments once --the first time they are called;
and from there on after always return the same result without
computing anything. I've been thinking for longer than I care to
compute, about a C++ implementation of lazy initialization and once
functions, but can't find an elegant way, to this day.

Might go something like,

template< typename T, (T fun)() >
struct once
{
typedef < typename T, (T fun)() > once_t;
T *presult;
once() : presult(0) {}
T operator()()
{
if( presult ) return *presult;
presult = new T( fun() );
}
};

And repeat for single and multiple, const and non-const arguments for
fun.

Andrew Koenig
Guest
Posts: n/a

 12-09-2003
> Am I correct in assuming there is no guaranteed order of
> initialization for a and b in the statement
>
> int a=1, b=a+1;
>
> In other words, b=a+1 could be evaluated before a=1, right?

No, you're not correct. This declaration is equivalent to

int a = 1;
int b = a+1;