三元运算符如何使用3个操作数?

How does ternary operator use 3 operands?

三元运算符看起来像这样

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

我的老师说三元运算符使用 3 个操作数

这里是 mab... 即使 m 实际上是我们存储数据的变量...

但是当我们在写作的时候

m = a + b;

这里我们也写m作为存储变量,为什么这不是一个三元语句?

m 不是您询问其操作数数量的两个运算符(三元条件运算符和 + 运算符)中任何一个的操作数。这只是您分配这两个运算符的结果的变量二。

您的示例中的表达式只是 (a > b) ? a : b,操作数是 (a > b)ab

a + b中,操作数是ab,所以只有两个操作数。

请注意,我的回答没有提到问题没有问到的赋值运算符 =

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

如果你看

的抽象语法树
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

"ternary" 指的是 ConditionalExpression 在树中有 3 个直接子节点(带括号的树和两个标识符)。

赋值是一棵二叉树,因为它有两个直接子节点(标识符和条件表达式)。

m = a + b; 的树将是:

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

同样(而且总是),赋值是一个二元运算符,有两个直接子运算符:标识符和加法。加法是一个单独的二元运算符,有两个直接子运算符。

运算符的元数由操作数/参数的数量决定。一元运算符接受一个操作数,如 i++(post-增量),二元运算符,如 a + b,接受两个参数,还有 三元 运算符 a ? b : c 需要三个操作数。

操作数可以使用相同的变量或表达式。例如,在表达式 a + a 中,+ 运算符仍然是一个 binary 运算符,它接受两个参数——它只是接受相同的参数两次。

m = <expression> 是一个赋值。赋值运算符也是一个带有两个参数的二元运算符。在左侧,您有赋值的目标,在您的例子中是变量 m,在右侧,您有给出值的(复杂)表达式。

剩下 (a > b) ? a : b。还有三个操作数——条件是(a > b)a真表达式b错误的表达.

这个运算符定义在§15.25 of the JLS:

The conditional operator has three operand expressions. ? appears between the first and second expressions, and : appears between the second and third expressions.
(Highlight mine).