三元运算符如何使用3个操作数?
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
,所以只有两个操作数。
请注意,我的回答没有提到问题没有问到的赋值运算符 =
。
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).
三元运算符看起来像这样
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
,所以只有两个操作数。
请注意,我的回答没有提到问题没有问到的赋值运算符 =
。
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).