C условный оператор ('?') С пустым вторым параметром
Как правило, "?" Оператор используется в следующей форме:
A ? B : C
Однако в тех случаях, когда B = A I видели следующее сокращение
A ? : C
Это удивительно работает. Лучше оставить второй параметр (по стилю), или есть шанс, что некоторые компиляторы не смогут справиться с этим?
6 ответов
Это не разрешено языком C (насколько я знаю), но компиляторы, такие как gcc, имеют ярлык a?: C в качестве расширения.a?:c
означает так же, как a?a:c
,
Если я не ошибаюсь, вы используете расширение компилятора (по-видимому, gcc). Я почти уверен, что стандарт не позволяет вам опустить второй операнд для троичного оператора.
Я заполняю немного.
В стандарте используется термин условный оператор.
Синтаксис условно-выражение: логическое ИЛИ-выражение логическое ИЛИ-выражение ? выражение: условное выражение
Условное выражение не дает lvalue. Также; Wikipedia; условный
Примечание: то есть: C++ имеет:
логическое ИЛИ-выражение? выражение: присваивание- выражение
Ограничения: * Первый операнд должен иметь скалярный тип [1]. * Для второго и третьего операндов должно быть одно из следующих: - оба операнда имеют арифметический тип [2]; - оба операнда имеют одинаковую структуру [3] или тип объединения [4]; - оба операнда имеют тип пустоты [5]; - оба операнда являются указателями на квалифицированные или неквалифицированные [6] версии совместимых Типы [7] ; - один операнд является указателем, а другой - константой нулевого указателя [8]; или же - один операнд является указателем на объект или неполный тип [9], а другой - является указателем на квалифицированную или неквалифицированную версию void.
Пища для ног:
[1] Скалярный тип: арифметические типы и типы указателей. [2] Арифметический тип: целочисленные и плавающие типы. [3] Тип структуры: последовательно распределенный непустой набор объектов-членов (и, в определенные обстоятельства, неполный массив), каждый из которых имеет необязательно указанное имя и, возможно, отдельный тип. [4] Тип объединения: перекрывающийся непустой набор объектов-членов, каждый из которых имеет необязательно указанное имя и, возможно, отдельный тип. [5] Тип Void: пустой набор значений; это неполный тип, который не может быть завершено. [6] Квалифицированный тип: 1998 (постоянный и изменчивый), 1999 (ограниченный), соответственно 2011 (_Atomic). * [7] Совместимый тип: их типы одинаковы. [8] Null ptr. const.: NULL; определяемая реализацией константа нулевого указателя. [9] Неполный тип: типы, которые описывают объекты, но не имеют информации, необходимой для определения их размеры.
Итак: не разумно использовать.
Я провел небольшое исследование в Интернете, согласно Википедии, это поведение поддерживается расширением GNU языка C. http://en.wikipedia.org/wiki/%3F:::::
Поэтому весьма вероятно, что другие компиляторы считают это незаконным. Кстати, этот оператор называется троичным условно, поэтому вы можете просмотреть его.
РЕДАКТИРОВАТЬ:
Я проверил в gcc и apple llvm, и он отлично работает.
Второй параметр лучше оставить. Если B когда-либо изменится, вы можете не забыть изменить приведенное выше утверждение. Кроме того, другие люди могут испытывать затруднения при чтении вашего кода и улучшении его, если вы оставите B вне утверждения.