By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,305 Members | 1,834 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,305 IT Pros & Developers. It's quick & easy.

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

P: n/a
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?
Jul 22 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a

"Derek" <no**@none.com> wrote in message news:br*************@ID-46268.news.uni-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.
Jul 22 '05 #2

P: n/a
On Tue, 9 Dec 2003 12:04:45 -0500, "Derek" <no**@none.com> 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.
Jul 22 '05 #3

P: n/a
> 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;
Jul 22 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.