繁体   English   中英

三元运算符如何使用 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)? a: b ,操作数是(a > b)ab

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

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

如果你看一下抽象语法树

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

再次(并且总是),赋值是一个二元运算符,有两个直接的孩子:标识符和加法。 加法是一个单独的二元运算符,有两个直接子代。

operands一词不是指使用的变量,而是指三元运算符的不同部分。 他们是

  • 如果条件被评估为True ,将返回result1
  • condition1判断结果的条件
  • 如果条件被评估为False ,将返回result2
result1 if condition1 else result2

然后你在打印中使用它,或者保存它,但这不是三元运算符本身的一部分

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

运算符的数量由操作数/ arguments 的数量决定。 有像i++ (后增量)这样采用一个操作数的一元运算符,像a + b这样采用两个 arguments 的二元运算符,还有三元运算符a? b: c a? b: c接受三个操作数。

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

m = <expression>是一个赋值。 赋值运算符也是一个二元运算符,它需要两个 arguments。 在左侧,您有赋值的目标,在您的情况下是变量m ,在右侧,您有给出值的(复杂)表达式。

这让你有(a > b)? a: b (a > b)? a: b 仍然有三个操作数 - 条件是(a > b)a真表达式b假表达式

该运算符在 JLS 的 §15.25 中定义:

条件运算符具有三个操作数表达式 ? 出现在第一个和第二个表达式之间,并且:出现在第二个和第三个表达式之间。
(突出我的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM