This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: C Ternary Conditional Expression Last Operand Omission


On 16 March 2018 at 19:30, Garreau, Alexandre wrote:
> Hi,
>
> I was reading the “C Extensions” section of GCC manual [0] about GNU
> extensions, and going through the part about conditional expression
> operand omission, I noticed it said it allowed the omission of the
> *middle* operand (then nicely allowing some construct really similar to
> the lisp or)
>
> But I don’t understand why the analogous omission of the last operand
> with the same semantics (returning the first operand if we need to
> return the omitted one) is not permitted then. It’s not already standard
> nor then supported by gcc, and though the same effect can be obtained by
> negating the first operand, I find usually more expressive to let a
> positive test expression. Also omitting the last instead of the middle
> operand would have seemed more natural to write (as it maybe would have

It seems less natural to me.

"return val ?: alt;" means "if val is good, return it, otherwise some
fallback alternative". This is useful e.g. when val is a pointer and
you want to avoid returning NULL.

"return val ? alt :;" would mean "if val is good, return something
else, otherwise return the value we just decided is not good"

The other reason that "x ? : y" makes more sense is that for scalar
values in C there are many true values (anything non-zero) but only
one false value (zero). If it's any of the true values, return it,
otherwise return false. Whereas with "x ? y :" it would mean if it's
any true value, return a specific value (losing the original value of
x) otherwise return x (which we know must be zero in this case).

When you're using the extension to avoid evaluating an operand twice
(as explained in the manual) "x ? : y" serves a useful purpose. Your
suggestion doesn't add anything, because you can just write "x ? y :
0" to avoid evaluating x twice.



> allowed to omit the colon too, if I’m not wrong about something
> conflicting with it in C syntax, as it would simplify syntax and allow
> more non-simply-erroneous combinations of syntax).
>
> Is there any justification to that? was it just considered as
> unnecessary? Was this form considered less useful? was a feature
> looking alike lisp or considered more evidently useful?
>
> Should I ask on the main gcc list?
>
> [0] (info "(gcc-6) C Extensions")
> [1] (info "(gcc-6) Conditionals")


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]