Гарантируется ли разбор как «(a? B: (c? D: e))»? - PullRequest
0 голосов
/ 05 июня 2018

Предположим, если я использую троичный оператор, как это: a ? b : c ? d : e

Код:

#include <stdio.h>

int main()
{
    int a=1,b=2,c=3,d=4,e=5;
    printf("%d\n", a ? b : c ? d : e);
    return 0;
}

Gcc и Clang Дайтеoutput 2.

Вопросы:

  • Гарантируется ли разбор как (a ? b : (c ? d : e))?или
  • Это неопределенное поведение?
  • Что говорит об этом стандарт C?

1 Ответ

0 голосов
/ 05 июня 2018

Синтаксис для троичного оператора, также известного как условное выражение , определен в разделе 6.5.15 C стандарта следующим образом:

условное выражение:

логическое-ИЛИ-выражение
логическое-ИЛИ-выражение?выражение: условное выражение

Поскольку «выражение условия» не является «выражением логического ИЛИ» (читай: логический оператор ИЛИ имеет более высокий приоритет), это предотвращает a ? b : c ? d : eот разбора как (a ? b : c) ? d : e.Это также означает, что оператор справа налево ассоциативен с самим собой.Поэтому он анализируется как a ? b : (c ? d : e).

. Для более подробной информации вы можете найти правила приоритета оператора здесь .Несмотря на то, что стандарт является официальным источником, в этой таблице перечислены правила, которые легче понять.

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

...