order of evaluation

A

ASobol

//code.begin()
#include <iostream>

int g (int i)
{
static const int j = i;
return j;
}

int main (int, char**)
{
std::cout << g(0) << g(1) << g (2) << g(3);
return 0;
}
//code.end()

Is output of this program undefined due to C++ standart?
Compilers i have access to (msvc 7.1 and gcc 3.3) both produce "3333"
output.


--Sasha
 
S

Sumit Rajan

ASobol said:
//code.begin()
#include <iostream>

int g (int i)
{
static const int j = i;
return j;
}

int main (int, char**)
{
std::cout << g(0) << g(1) << g (2) << g(3);

The compiler is allowed to determine the order in which the 4 calls to g()
are executed.
return 0;
}
//code.end()

Is output of this program undefined due to C++ standart?

Undefined behaviour. See:
http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-38.16
http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-38.15
http://www.langer.camelot.de/Articles/VSJ/SequencePoints/SequencePoints.html



Regards,
Sumit.
 
M

msalters

Sumit said:
The compiler is allowed to determine the order in which the 4 calls to g()
are executed.

Yes, but it may not execute them concurrently (unless you cannot detect
it, of course. "as if"-rule ). One call must be made first. It may be a
different choice on every run, though.
Undefined behaviour.

Wrong, unspecified. There are proper sequence points between the
calls, the only thing unspecified is the order of sequence points.
No variable is modified twice between sequence points. In fact,
the only variable modified is static const int j, which by
definition cannot be modified twice at all.

Regards,
Michiel Salters
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top