Как тернарный оператор использует 3 операнда? - PullRequest
0 голосов
/ 17 июня 2020

Тернарные операторы выглядят так

m = (a > b) ? a : b;

Мой учитель говорит, что тернарные операторы используют 3 операнда

, которые здесь m, a и b ... даже если m на самом деле переменная, в которой мы храним данные ...

Но когда мы пишем

m = a + b;

Здесь мы также пишем m как переменную хранения, поэтому почему это не троичное утверждение?

Ответы [ 4 ]

4 голосов
/ 17 июня 2020

Если вы посмотрите на абстрактное синтаксическое дерево

m = (a > b) ? a : b;

, это будет примерно так:

ExpressionStatement       // m = (a > b) ? a : b;
  Assignment              // m = (a > b) ? a : b
    Identifier            // m
    ConditionalExpression //     (a > b) ? a : b
      Parenthesized       //     (a > b)
        BinaryOperator >  //      a > b
          Identifier      //      a
          Identifier      //          b
      Identifier          //               a
      Identifier          //                   b

Тернарный термин относится к тому факту, что ConditionalExpression имеет 3 прямые дочерние элементы в дереве (дерево в скобках и два идентификатора).

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

Дерево для m = a + b; будет:

ExpressionStatement  // m = a + b;
  Assignment         // m = a + b
    Identifier       // m
    BinaryOperator + //     a + b
      Identifier     //     a
      Identifier     //         b

Опять же (и всегда) присваивание является бинарным оператором с двумя прямыми дочерними элементами: идентификатором и сложением. Сложение - это отдельный бинарный оператор с двумя прямыми дочерними элементами.

4 голосов
/ 17 июня 2020

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

Выражение в вашем примере просто (a > b) ? a : b, а операнды - (a > b), a и b.

В a + b операндами являются a и b, поэтому есть только два операнда.

Обратите внимание, что в моем ответе ничего не говорится об операторе присваивания =, который задает вопрос не спрашивал о.

0 голосов
/ 17 июня 2020

Арность оператора определяется количеством операндов / аргументов. Есть унарные операторы, которые принимают один операнд, например i++ (постинкремент), бинарные операторы, такие как a + b, которые принимают два аргумента, и есть тернарный оператор a ? b : c, который принимает три операнда.

Операнды могут использовать одну и ту же переменную или выражение. Например, в выражении a + a оператор + по-прежнему является оператором двоичного , который принимает два аргумента - он просто принимает один и тот же аргумент дважды.

m = <expression> - это назначение. Оператор присваивания также является бинарным оператором, который принимает два аргумента. С левой стороны у вас есть цель присваивания, которой в вашем случае является переменная m, а с правой стороны у вас есть (сложное) выражение, которое дает значение.

Это оставляет вас с (a > b) ? a : b. Есть еще три операнда - условное выражение (a > b), a - это истинное выражение , а b - ложное выражение .

Этот оператор определен в §15.25 JLS :

Условный оператор имеет три выражения операнда . ? появляется между первым и вторым выражениями, а : появляется между вторым и третьим выражениями.
(Выделите мое).

0 голосов
/ 17 июня 2020

Слово operands относится не к используемой переменной, а к другой части тернарного оператора. Они:

  • result1 будут возвращены, если проверка будет оценена как True
  • condition1 условие для определения результата
  • result2 будет возвращено, если конфиция будет оценена как False
result1 if condition1 else result2

Затем вы используете это в печати или сохраните его, но это не является частью самого тернарного оператора

print('Win' if value==15 else 'Loose') # print it
res = 55 if value%5==6 else 33         # save it
...