Неожиданный результат, троичный оператор в Gnu C - PullRequest
1 голос
/ 19 марта 2012

Таким образом, приоритет оператора троичного оператора в C кажется мне действительно странным.Показательный пример:

#include <stdio.h>

int main ()
{
   int i=5;
   int j=6;
   int k=7;
   printf("A: %d\n", i+j+(k!=7)?1:11); //prints 1
   printf("B: %d\n", i+j+((k!=7)?1:11)); //prints 22
   return 0;
}

Это похоже на вопрос здесь: C ++ Приоритет троичных условных операторов и операторов присваивания Порядок оценки троичного оператора

В качестве пояснения я понимаю, что круглые скобки заставляют его работать, как указано в моих комментариях в моем первоначальном посте ...

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

Но этот вопрос касается операторов слева или внутри членов класса, гдекак это странное поведение происходит на RHS.

Ответы [ 2 ]

6 голосов
/ 19 марта 2012

Что здесь странного?Первая часть интерпретируется как:

(11 + (k != 7)) ? 1 : 11

, а вторая интерпретируется как

 11 + ((k !=7) ? 1 :11)

Первая вызвана правилами приоритета (двоичная арифметика имеет более высокий приоритет, чем троичный оператор)а вторая обходит правила приоритета, группируя выражение с круглыми скобками.

Ваше редактирование запрашивает причины, и обычно о них можно только догадываться, если кто-то из членов комитета С, присутствовавший в то время, не приходит на помощь,Я полагаю, что гораздо сложнее использовать сложное выражение и запрашивать его значение истинности, чем использовать троичный оператор для определения значения выражения в арифметике.Нечто подобное приходит на ум:

return (froble() + 3) == 0 ? 23 : 5; // parens for sanity but works without

, если это будет интерпретировано как return (froble() + 3) == 5;, я был бы по-настоящему шокирован.

0 голосов
/ 18 марта 2016

Следует выбирать очень высокий или очень низкий приоритет, и тот или другой будет удивлять кого-то, кто делает неправильное предположение.

Полезная причина выбора низкого приоритета состоит в том, что это означает, что операторфункции наподобие конструкции if .. then .. else .. без фигурных скобок, что может означать меньшую работу для разработчиков компиляторов (которые могут использовать один и тот же код для обработки обоих), и простой рефакторинг со стороны кодеров, которые понимают приоритет.

На практике язык, вероятно, стандартизировал любой приоритет, который был самым популярным использованием в коде, написанном в эпоху до стандартизации.

...