C conditional operator ('?') with empty second parameter
Solution 1
It is not permitted by the language C (as far as I know), but compilers such as gcc have the shortcut a?:c as an extension.
a?:c
means the same as a?a:c
.
Solution 2
Its a gcc's extension
Conditionals with Omitted Operands
x ? : y
is equivalent to x ? x : y
Solution 3
Unless I'm badly mistake, you're using a compiler extension (at a guess, gcc). I'm pretty sure the standard does not allow you to omit the second operand to the ternary operator.
Solution 4
I fill in a bit.
The standard uses the term conditional operator.
Syntax conditional-expression: logical-OR-expression logical-OR-expression ? expression : conditional-expression
A conditional expression does not yield an lvalue. Also; Wikipedia; Conditional
Note: I.e.: C++ has:
logical-OR-expression ? expression : assignment-expression
Constraints: * The first operand shall have scalar type[1]. * One of the following shall hold for the second and third operands: — both operands have arithmetic type[2]; — both operands have the same structure[3] or union type[4]; — both operands have void type[5]; — both operands are pointers to qualified or unqualified[6] versions of compatible types[7]; — one operand is a pointer and the other is a null pointer constant[8]; or — one operand is a pointer to an object or incomplete type[9] and the other is a pointer to a qualified or unqualified version of void.
Foot food:
[1] Scalar type : Arithmetic types and pointer types. [2] Arithmetic type : Integer and floating types. [3] Structure type : A sequentially allocated nonempty set of member objects (and, in certain circumstances, an incomplete array), each of which has an optionally specified name and possibly distinct type. [4] Union type : An overlapping nonempty set of member objects, each of which has an optionally specified name and possibly distinct type. [5] Void type : An empty set of values; it is an incomplete type that cannot be completed. [6] Qualified type : 1998 (const and volatile), 1999 (restrict), respectively 2011 (_Atomic). * [7] Compatible type : Their types are the same. [8] Null ptr. const.: NULL; implementation-defined null pointer constant. [9] Incomplete type : Types that describe objects but lack information needed to determine their sizes.
So: Not wise to use.
Solution 5
i did a little research in the web, acording to wikipedia, this behavior is supported by a GNU extension of C. http://en.wikipedia.org/wiki/%3F:#C
So it is very probable that other compilers consider this illegal. By the way, this operator is called ternary conditional so you can browse about it.
EDIT:
I checked in gcc and apple llvm and it works fine.
Locksleyu
Updated on June 06, 2022Comments
-
Locksleyu almost 2 years
Typically the '?' operator is used in the following form:
A ? B : C
However in cases where B = A I have seen the following abbreviation
A ? : C
This surprisingly works. Is it better to leave the second parameter in (style wise), or is their a chance certain compilers won't be able to handle this?
-
Lion about 12 yearsLooking like Groovy-like syntax.
-
-
Celada about 12 yearsThe page you linked to contradicts itself. On the one hand it says "This example is perfectly equivalent to
x ? x : y
", which meansx
is evaluated twice, but on the other hand the last paragraph states thatx
would be evaluated only once, which would make it perfectly equivalent tox || y
, notx ? x : y
-
Prasoon Saurav about 12 years@Celada : I think it means to say that
x ? : y
is roughly equivalent tox ? x : y
exceptx
gets evaluated only once in the former case. -
Prasoon Saurav about 12 years@Celada :
x || y
evaluates to 0 or 1 which is not the case with this operator. -
Celada about 12 yearsI stand corrected. I thought
||
returned value value of its first argument if the first argument was something that is considered true (nonzero). -
Jack about 12 yearsIt's one of ISO C99 features. It works fine for me on
GCC
4.4.1<TDM-2 mingw32> andTCC
(that's an ANSI C compiler) version 0.9.25 on Windows plataform. -
mbauman about 12 yearsIt means the same... with the caveat that
a
does not contain side-effects.a?:c
only executesa
once, whereasa?a:c
would execute the side-effects ofa
twice. -
4LegsDrivenCat over 2 yearsIt works for Clang too.
-
4LegsDrivenCat over 2 yearsIt works for Clang too, not only GCC.