【发布时间】:2022-01-17 08:20:03
【问题描述】:
我不是专家,但我喜欢学习和理解。考虑到这一点,我在 Arduino IDE 中编写了以下内容:
lockout[idx] ? bulb[idx].off() : bulb[idx].on();
替换这个:
if (lockout[idx]) bulb[idx].off(); else bulb[idx].on();
lockout[] 是 bool 的数组,bulb[] 是一个类的数组,具有 .off 和 .on 方法。
我四处寻找示例,但从未见过? 三元运算符的这种用法。我读到的内容似乎说这不应该起作用。
但它确实可以编译。那么这实际上是合法的 C++ 吗?
【问题讨论】:
-
只要 off() 和 on() 返回一些东西(不是 void)并且这两个值是兼容的,它就可以工作。通常以某种方式使用三元的输出(例如分配给变量或其他东西)。这不是惯用语。
-
这并不意味着您应该以这种方式实际使用它。这是丑陋的、具有误导性的,并且可能会在未来产生问题。
-
@offtkp no
?不只是扩展到if else。计算返回类型有一些细微的差别,可能会让你措手不及。 C++“扩展”到其他 C++ 的情况很少。我所知道的唯一一个“真正的”是for(:)循环。其他情况(lambdas,更专业的模板等)在标准中充满了软糖词。同时,?:不是根据if else定义的。现在,你说的是一个有用的谎言,但是当你说这些有用的谎言时,你应该尽量弄清楚这一点。 -
@Offtkp — 这是对
?:所做的非常具有误导性的描述。这是一个表达式,所以它有一个值。if … else …是一个声明。它没有价值。表达式和语句是根本不同的东西。 -
除了编译器错误之外,如果 C++ 编译器成功编译,它通常会证明是合法的 C++(尽管它可能具有未定义的行为)。也就是说,如果
lockout[idx]可以转换为数字类型,并且bulb[idx].off()和bulb[idx].on()都有效并且返回相同的类型,那么lockout[idx] ? bulb[idx].off() : bulb[idx].on()绝对是一个有效的表达式。
标签: c++ arduino conditional-operator