Is -1 > 7 ?

Yota yotaxp at thatGoogleMailThing.com
Sun Aug 11 10:01:45 PDT 2013


On Friday, 9 August 2013 at 17:35:18 UTC, monarch_dodra wrote:
> On Friday, 9 August 2013 at 15:28:10 UTC, Manfred Nowak wrote:
>> michaelc37 wrote:
>>> WTF -> -1 is greater than 7 ????
>> 
>> From the docs:
>>
>> It is an error to have one operand be signed and the other 
>> unsigned for a
>> <, <=, > or >= expression.
>>
>> -manfred
>
> Interesting. I didn't know it was documented as being an 
> outright error, I thought it was just "surprising"...
>
> I don't think Walter will ever accept to make it illegal 
> though, breaks too much code. If this was a change he was OK 
> with, I think we would have had it since day one, or at least, 
> years ago.

I remember hearing somewhere that D is about enforcing users to 
write CORRECT code.  I would really be disappointed with the 
language if this sort of gotcha weren't eliminated.

If I look at this assert, I shouldn't be expecting it to pass.
static assert(-1 > cast(size_t)7);

IMHO, as long as this sort of comparison causes a compile-time 
error, as the docs say they should, this kind of breaking change 
is the of very good sort.  The sort that reveals bugs in code. 
(Like when they changed the NULL macro to mean 'nullptr' instead 
of 0 in C++.) I couldn't imagine a programmer exploiting this 
intentionally, as it serves no purpose.

> Related: std.algorithm.max *is* sign aware, and you can use 
> code such as:
> if (a == max(a, b))
>
> I have an pull request which creates the premise of functional 
> "less"/"greater" operators, which are also sign aware:
> https://github.com/D-Programming-Language/phobos/pull/1365/files
>
> *If* it goes through, and *if* we make them public in 
> std.functional, then it allows code such as:
> int a = -1;
> size_t b = 7;
> assert(a.less(b)); //Passes

That is pretty cool, but unless the comparison operators actually 
use that code, (which they probably won't, since it's not a 
library thing?) it will only provide a workaround to the problem.


More information about the Digitalmars-d-learn mailing list