Подтвердить что ты не робот

C условный оператор ('?') С пустым вторым параметром

Обычно '?' оператор используется в следующем виде:

A ? B : C

Однако в тех случаях, когда B = A, я видел следующую аббревиатуру

A ? : C

Это удивительно работает. Лучше ли оставить второй параметр в (стильный мудрый), или это вероятность того, что некоторые компиляторы не смогут справиться с этим?

4b9b3361

Ответ 1

Это не разрешено языком C (насколько мне известно), но компиляторы, такие как gcc, имеют ярлык a?: c как расширение . a?:c означает то же, что и a?a:c.

Ответ 3

Если я ошибочно ошибаюсь, вы используете расширение компилятора (при догадке, gcc). Я уверен, что стандарт не позволяет опустить второй операнд троичному оператору.

Ответ 4

Заполняю немного.

В стандарте используется термин условный оператор.

Syntax
  conditional-expression:
          logical-OR-expression
          logical-OR-expression ? expression : conditional-expression

Условное выражение не дает lvalue. Также; Википедия; Условный

Примечание: I.e.: С++ имеет:
     логическое-OR-выражение? выражение: назначение -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.

Пища для ног:

[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.

*Типовые классификаторы в C

Итак: Неразумно использовать.

Ответ 5

Я сделал небольшое исследование в Интернете, согласно википедии, это поведение поддерживается расширением GNU C. http://en.wikipedia.org/wiki/%3F:#C

Поэтому очень вероятно, что другие компиляторы считают это незаконным. Кстати, этот оператор называется тернарным условным, поэтому вы можете просмотреть его.

EDIT:

Я проверил в gcc и apple llvm, и он отлично работает.

Ответ 6

Лучше оставить второй параметр в. Если B когда-либо изменяется, вы можете не помнить, чтобы изменить приведенное выше утверждение. Кроме того, у других людей может быть трудное время, когда вы читаете свой код и улучшаете его, если вы оставите B вне утверждения.