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

Как правило, "?" Оператор используется в следующей форме:

A ? B : C

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

A ? : C

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

6 ответов

Решение

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

Это расширение GCC

Условные выражения с опущенными операндами

x ? : y эквивалентно x ? x : y

Если я не ошибаюсь, вы используете расширение компилятора (по-видимому, 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] Неполный тип: типы, которые описывают объекты, но не имеют информации, необходимой для определения  
                       их размеры. 
 

* Введите классификаторы в C

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

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

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

РЕДАКТИРОВАТЬ:

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

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

Другие вопросы по тегам