www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - op=

reply Ellery Newcomer <ellery-newcomer utulsa.edu> writes:
according to the spec,

a op= b;

is semantically equivalent to

a = a op b;

but this doesn't seem to be strictly true. for example:

char c = 'a';
real r = 3.14;

c = c + r; // error

c += r;  // accepted; seems to be doing c += floor(r);

is this behavior intentional?
Jan 21 2010
next sibling parent Rainer Deyke <rainerd eldwood.com> writes:
Ellery Newcomer wrote:
 according to the spec,
 
 a op= b;
 
 is semantically equivalent to
 
 a = a op b;
 
 but this doesn't seem to be strictly true.

It's untrue in several ways. For example: SomeReferenceType a, b; a = a + b; // Creates new object. b += c; // Modifies an object in place. and of course: a = a = c; // Dual assignment. a == b; // Equality comparison. -- Rainer Deyke - rainerd eldwood.com
Jan 21 2010
prev sibling parent reply "Steven Schveighoffer" <schveiguy yahoo.com> writes:
On Thu, 21 Jan 2010 22:44:24 -0500, Ellery Newcomer  
<ellery-newcomer utulsa.edu> wrote:

 according to the spec,

 a op= b;

 is semantically equivalent to

 a = a op b;

 but this doesn't seem to be strictly true. for example:

 char c = 'a';
 real r = 3.14;

 c = c + r; // error

 c += r;  // accepted; seems to be doing c += floor(r);

 is this behavior intentional?

There are two issues, I think recently discussed, a op= b is actually equivalent to: a = a op cast(typeof(a))b; when dealing with primitives. I'm not sure if this happens with user defined types. And the second issue (if you want to get technical) is that a op= b is considered a different operation than a = a op b because one can manually optimize a op= b more than a = a op b. So technically the seemingly analogous calls can do something different. A good example is array appending, a ~= b is not equivalent to a = a ~ b, because the former may allocate in place and the latter always reallocates. -Steve
Jan 22 2010
parent Ellery Newcomer <ellery-newcomer utulsa.edu> writes:
On 01/22/2010 12:23 PM, Steven Schveighoffer wrote:
 On Thu, 21 Jan 2010 22:44:24 -0500, Ellery Newcomer
 <ellery-newcomer utulsa.edu> wrote:

 according to the spec,

 a op= b;

 is semantically equivalent to

 a = a op b;

 but this doesn't seem to be strictly true. for example:

 char c = 'a';
 real r = 3.14;

 c = c + r; // error

 c += r; // accepted; seems to be doing c += floor(r);

 is this behavior intentional?

There are two issues, I think recently discussed, a op= b is actually equivalent to: a = a op cast(typeof(a))b; when dealing with primitives. I'm not sure if this happens with user defined types. And the second issue (if you want to get technical) is that a op= b is considered a different operation than a = a op b because one can manually optimize a op= b more than a = a op b. So technically the seemingly analogous calls can do something different. A good example is array appending, a ~= b is not equivalent to a = a ~ b, because the former may allocate in place and the latter always reallocates. -Steve

Alright, that makes sense enough, thanks. Spec needs to be changed, though http://d.puremagic.com/issues/show_bug.cgi?id=3735
Jan 23 2010