【问题标题】:Failing ternary operator失败的三元运算符
【发布时间】:2021-03-22 21:25:02
【问题描述】:

我有这个总是返回 true 的三元运算符:

int waitingTime = 0;
int awayPeriodThreshold = 5;

bool myOperator= 0? (waitingTime < awayPeriodThreshold) : 1;

我在 GoogleTest EXPECT_EQ 中使用它来比较两个布尔值。

我有一个测量时间的程序,当时间未达到给定阈值(在本例中为 5 秒)时输出为 0,当大于或等于 5 秒时输出为 1。这可以正常工作,但是当我尝试使用它时:

//at the beginning
bool isHigherThanTimeThreshold = 0
EXPECT_EQ(isHigherThanTimeThreshold, myOperator) //Test fails
// after lets say 10 seconds, isLowerThanTimeThreshold changes to 1
EXPECT_EQ(isHigherThanTimeThreshold, myOperator) //Test passes

它总是失败,因为 myOperator 总是为真,即使在等待时间为 0 的开始时 awayPeriodThreshold 为 5;

我该如何解决这个问题?

非常感谢您的帮助。

【问题讨论】:

  • 看起来你从 Python 中得到了关于三元运算符的想法?如果这是真的,我建议你忘记从 Python 中学到的一切,像学习第一语言一样学习 C++。这比试图在这两种语言之间进行比较要容易得多。

标签: c++ googletest conditional-operator


【解决方案1】:
bool myOperator= 0? (waitingTime < awayPeriodThreshold) : 1;

意思

bool myOperator= 1;

因为0 总是被视为假。

C++ 中的三元运算符表示condition ? value when true : value when false

因此,你应该这样写:

int myOperator= (waitingTime < awayPeriodThreshold) ? 0 : 1;

请注意,您应该使用int(或其他整数类型,如char)来存储整数。

你可以这样写

bool myOperator = !(waitingTime < awayPeriodThreshold);

bool myOperator = (waitingTime >= awayPeriodThreshold);

只检查条件。

【讨论】:

  • 非常感谢,我过度设计了它,没有意识到它可以这么简单。接受答复的时限尚未结束,但我会尽快接受您的答复,再次感谢您。
  • @Mechatrnk 抱歉,我之前的回答中的bool myOperator = (waitingTime &lt; awayPeriodThreshold); 将给出与问题中指定的相反的结果。固定。
  • 最后一个可以不写(多余的括号)。
猜你喜欢
  • 2018-10-31
  • 2023-04-08
  • 1970-01-01
  • 2011-05-23
  • 2013-12-04
  • 2011-04-19
  • 2019-11-05
  • 1970-01-01
  • 2021-10-06
相关资源
最近更新 更多