The new ?? and ??? operators

Chris Nicholson-Sauls ibisbasenji at gmail.com
Sun Sep 23 10:47:08 PDT 2007


Arlen Albert Keshabyan wrote:
> Vladimir Panteleev Wrote:
> 
>> On Sun, 23 Sep 2007 18:34:09 +0300, Arlen Albert Keshabyan <arlen.albert at gmail.com> wrote:
>>
>> [regarding ???]
>>> The lvalue gets the first rvalue that evaluates to true (evaluation goes from left to right). 
>> So the result can only be boolean?
>> In this case, I don't understand how
>>   a = b ??? c ??? d;
>> is different from
>>   a |= b || c || d;
>>
>> If b, c and d are false then a is unchanged.
>>
>> -- 
>> Best regards,
>>  Vladimir                          mailto:thecybershadow at gmail.com
> 
> 
> Consider this:
> 
> int v = 15;
> int v2 = 30;
> 
> int a = v > 20 ??? v = 17 ??? v2 < 25 ??? 5;
> 
> in this case 'a' evaluates to 5 because none of the conditions evaluate to true except the last one. if you remove the last condition (??? 5) then 'a' stays 0 in this case.
> 
> If v2 = 23 then 'a' evaluates to 23;
> If v = 27 then 'a' evaluates to 27;
> 
> etc.
> 
> It means that it takes a sequential rvalue, tests it against a condition and if the condition evaluates to true then it assigns that rvalue to lvalue. It does not mean you are restricted to boolean values only.

Or in other words this:

int a = v   > 20
     ??? v  == 17
     ??? v2  < 25
     ??? 5
;

Is supposed to be shorthand for this?

int a;
if (v  > 20 ||v == 17)
     a = v;
else if (v2 < 25)
     a = v2;
else
     a = 5;


...its an interesting thought, but it just feels more like a scripting language feature 
than that of a systems language.  The other '??' version that just skips nulls could be 
useful at times, though.  Hmm.

-- Chris Nicholson-Sauls



More information about the Digitalmars-d mailing list