[英]How does ternary operator use 3 operands?
三元运算符看起来像这样
m = (a > b) ? a : b;
我的老师说三元运算符使用 3 个操作数
这里是m
, a
和b
...即使m
实际上是我们存储数据的变量...
但是当我们写
m = a + b;
在这里,我们也将m
写为存储变量,那么为什么这不是三元语句呢?
m
不是您询问其操作数数量的两个运算符(三元条件运算符和+
运算符)中的任何一个的操作数。 这只是您分配这两个运算符的结果的变量二。
您示例中的表达式只是(a > b)? a: b
(a > b)? a: b
,操作数是(a > b)
, a
和b
。
在a + b
中,操作数是a
和b
,所以只有两个操作数。
请注意,我的回答没有说明问题没有提到的赋值运算符=
。
如果你看一下抽象语法树
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.