Ответ 1
Это не разрешено языком C (насколько мне известно), но компиляторы, такие как gcc, имеют ярлык a?: c как расширение .
a?:c
означает то же, что и a?a:c
.
Обычно '?' оператор используется в следующем виде:
A ? B : C
Однако в тех случаях, когда B = A, я видел следующую аббревиатуру
A ? : C
Это удивительно работает. Лучше ли оставить второй параметр в (стильный мудрый), или это вероятность того, что некоторые компиляторы не смогут справиться с этим?
Это не разрешено языком C (насколько мне известно), но компиляторы, такие как gcc, имеют ярлык a?: c как расширение .
a?:c
означает то же, что и a?a:c
.
Его расширение gcc
Условные обозначения с опущенными операндами
x ? : y
эквивалентно x ? x : y
Если я ошибочно ошибаюсь, вы используете расширение компилятора (при догадке, gcc). Я уверен, что стандарт не позволяет опустить второй операнд троичному оператору.
Заполняю немного.
В стандарте используется термин условный оператор.
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.
Итак: Неразумно использовать.
Я сделал небольшое исследование в Интернете, согласно википедии, это поведение поддерживается расширением GNU C. http://en.wikipedia.org/wiki/%3F:#C
Поэтому очень вероятно, что другие компиляторы считают это незаконным. Кстати, этот оператор называется тернарным условным, поэтому вы можете просмотреть его.
EDIT:
Я проверил в gcc и apple llvm, и он отлично работает.
Лучше оставить второй параметр в. Если B когда-либо изменяется, вы можете не помнить, чтобы изменить приведенное выше утверждение. Кроме того, у других людей может быть трудное время, когда вы читаете свой код и улучшаете его, если вы оставите B вне утверждения.