C++操作员"?:"
C++ operator "?:"
代码:
#include <cstdio>
struct Point
{
int x;
int y;
Point(int t_x, int t_y)
{
x = t_x;
y = t_y;
}
};
int main() {
Point lp(1, 4);
Point rp(5, 0);
int min_x, max_x, min_y, max_y;
lp.x > rp.x ? max_x = lp.x, min_x = rp.x : max_x = rp.x, min_x = lp.x;
lp.y > rp.y ? max_y = lp.y, min_y = rp.y : max_y = rp.y, min_y = lp.y;
std::printf("min_x: %d max_x: %dn", min_x, max_x);
std::printf("min_y: %d max_y: %dn", min_y, max_y);
}
我认为:
min_x=1 max_x=5
min_y=0 max_y=4
但真实:
min_x=1 max_x=5
min_y=4 max_y=4
为什么?
逗
号运算符的优先级最低,并且是从左到右关联的。表达式中下一个最低优先级运算符是?:
三元运算符,它是从右到左的关联运算符。因此,表达式的计算结果为:
( (lp.y > rp.y) ? ( (max_y = lp.y), (min_y = rp.y) ): (max_y = rp.y) ), (min_y = lp.y);
// The ?: ends here ^
那么,lp.y > rp.y
?是的。设置max_y = lp.y = 4
.然后计算最后一个(min_y = lp.y)
(逗号运算符(,所以min_y = lp.y = 4
也。
我真的真的希望这是一个练习,而不是实际的代码!
由于运算符优先级,行
lp.x > rp.x ? max_x = lp.x, min_x = rp.x : max_x = rp.x, min_x = lp.x;
lp.y > rp.y ? max_y = lp.y, min_y = rp.y : max_y = rp.y, min_y = lp.y;
等效于:
(lp.x > rp.x ? (max_x = lp.x, min_x = rp.x) : max_x = rp.x), min_x = lp.x;
(lp.y > rp.y ? (max_y = lp.y, min_y = rp.y) : max_y = rp.y), min_y = lp.y;
无论值是什么,min_x
都设置为 lp.x
。
无论值是什么,min_y
都设置为lp.y
。
您可以使用以下命令使代码易于遵循和维护:
int min_x, max_x, min_y, max_y;
if ( lp.x > rp.x )
{
max_x = lp.x;
min_x = rp.x;
}
else
{
max_x = rp.x;
min_x = lp.x;
}
相关文章:
- <<操作员在下面的行中工作
- C++ 与操作员不匹配<<
- 操作员C++的模棱两可的过载
- C++中>>操作员过载时出现问题?
- NaN 上的宇宙飞船操作员
- 比根<操作员
- SFINAE不能防止模棱两可的操作员过载吗?
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 为什么"delete"操作员给我访问权限冲突
- 为什么使操作员成为新的专用会打破 std::shared_ptr?
- 在这种情况下是私有的吗?试图使操作员<<过载
- C++操作员过载>>
- 是否有 C++20 浮点数的包装器,使我能够默认宇宙飞船操作员?
- 与异常处理程序中的操作员<<不匹配
- 复印作业操作员说明
- 友谊和操作员+=重载
- >操作员在比较两个C++容器时会怎么做?
- 与操作员比较两个计时时间点
- C++操作员订单评估
- 如何强制新操作员根据我的需要解释语句