Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Streaming and order of precedence

Reply
Thread Tools

Streaming and order of precedence

 
 
d.stonier@gmail.com
Guest
Posts: n/a
 
      03-19-2008
Hi all,

I've recently had some issues with the streaming operator and the
order of precedence used when mixing it with the member function
operator (operator .) Example code is below.

************************************************** ***********************
#include <iostream>
#include <vector>
using namespace std;

class A
{
public:
A() : i(0) {};
int f() {
i++;
v.push_back(i);
return i;
}

void reset() { i = 0; v.clear(); }

int i;
vector<int> v;
};

int main()
{
A a;

// Order of action:
// - Member functions fire from RIGHT to LEFT.
// - Insertion operators fire from LEFT to RIGHT
cout << a.f() << a.f();
cout << endl;

cout << "Vector contents a: ";
for (unsigned int i = 0; i < a.v.size(); ++i )
{
cout << a.v.at(i);
}
cout << endl;

a.reset();
int k;
// Order of action;
// - Member functions fire from LEFT to RIGHT
// - Addition operator fires.
// - Assignment operator fires.
k = a.f() + 3*a.f();
cout << "k: " << k << endl;
cout << "Vector contents a: ";
for (unsigned int i = 0; i < a.v.size(); ++i )
{
cout << a.v.at(i);
}
return 0;
}
************************************************** *******************************
OUTPUT:
21
Vector contents a: 12
k: 7
Vector contents a: 12
************************************************** *******************************

The result of this seems to indicate that the . operator for the
member function call has different associativities in the different
situations. I must be missing something here, but I haven't been able
to find anyone to give me a conclusive answer on it. Can anyone here
shed some light on it?

Cheers,
Daniel.
 
Reply With Quote
 
 
 
 
White Wolf
Guest
Posts: n/a
 
      03-19-2008
http://www.velocityreviews.com/forums/(E-Mail Removed)> wrote:
[SNIP]
> OUTPUT:
> 21
> Vector contents a: 12
> k: 7
> Vector contents a: 12


Well, this output seems fine to me. What did you expect to see?

ww (Attila)


 
Reply With Quote
 
 
 
 
Snorri
Guest
Posts: n/a
 
      03-19-2008
On Mar 19, 6:20*pm, "White Wolf" <(E-Mail Removed)> wrote:
> (E-Mail Removed)> wrote:
>
> [SNIP]
>
> > OUTPUT:
> > 21
> > Vector contents a: 12
> > k: 7
> > Vector contents a: 12

>
> Well, this output seems fine to me. *What did you expect to see?
>
> ww (Attila)


Expected a '12' on the first line in the cout. Curious as to why the
multiple a.f() calls are worked out from right to left in the
streaming case, but from left to right when doing the arithmetic case.
Is precedence and associativity for the '.' operator not entirely
fixed?
 
Reply With Quote
 
Paavo Helde
Guest
Posts: n/a
 
      03-19-2008
Snorri <(E-Mail Removed)> wrote in news:8230ccf5-b873-4478-8840-
(E-Mail Removed):

> On Mar 19, 6:20*pm, "White Wolf" <(E-Mail Removed)> wrote:
>> (E-Mail Removed)> wrote:
>>
>> [SNIP]
>>
>> > OUTPUT:
>> > 21
>> > Vector contents a: 12
>> > k: 7
>> > Vector contents a: 12

>>
>> Well, this output seems fine to me. *What did you expect to see?
>>
>> ww (Attila)

>
> Expected a '12' on the first line in the cout. Curious as to why the
> multiple a.f() calls are worked out from right to left in the
> streaming case, but from left to right when doing the arithmetic case.
> Is precedence and associativity for the '.' operator not entirely
> fixed?


The order of evaluation in this case is left unspecified (I guess in
order to give compilers a chance to optimize code better, or by historic
reasons).

Here using i++ twice during a full expression gives you merely
unspecified behavior because of sequence points at function enter/exit.
Without functions the behaviour would be undefined - see
http://www.parashift.com/c++-faq-lit...sues.html#faq-
39.15

hth
Paavo
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Order of precedence - In combination with '=' and without '=' karthikbalaguru C Programming 4 09-21-2009 10:32 PM
Streaming and Order of Precedence (II) Snorri C++ 1 03-19-2008 02:07 PM
Precedence,Associativity and order of evaluation vjay C Programming 7 11-27-2007 02:37 AM
expression and evaluation order and precedence rules silpau@gmail.com C Programming 26 06-15-2007 03:53 PM



Advertisments