这是 ?三元运算合法吗?

Is this ? ternary operation legal?

我不是专家,但我确实喜欢学习和理解。考虑到这一点,我在 Arduino IDE 中写了以下内容:

lockout[idx] ? bulb[idx].off() : bulb[idx].on();

替换这个:

if (lockout[idx]) bulb[idx].off(); else bulb[idx].on();

lockout[]bool的数组,bulb[]是class的数组,.off.on方法。

我四处寻找示例,但从未见过 ? 三元运算符的这种用法。我读过的内容似乎说这不应该起作用。

但它确实可以编译。那么这实际上是合法的 C++ 吗?

如果编译通过,它可能是格式正确的代码。如果三元运算符由于它们的类型而不能与这些操作数一起使用,编译器将发出错误消息。没有此类错误消息表明您的代码不存在此类问题。

但是,在某些情况下,使用三元运算符可能会导致意外复制。

如果onoff方法都return void(或者说bool)就不会有任何复制问题,代码将按预期工作:如果 lockout[idx] 为真,则 bulb[idx].off() 将被计算,否则 bulb[idx].on() 将被计算。只会评估两个备选方案中的一个,就像 if 语句会发生的情况一样。

一般情况下,三元运算符用于需要结果为表达式的情况。否则,使用 if 语句编写代码通常更具可读性。

是的,这是合法的 C++。虽然该运算符通常称为 三元运算符 ,但它在 C++ 标准中称为 条件运算符 ,并且在名为“的部分中定义expr.cond".

C++ 标准明确表示第二个和第三个操作数的类型都可以是 void。所以标准编写者知道人们可能希望使用此运算符作为编写 if 语句的简短方法,就像您正在做的那样。

如果第二个或第三个操作数的类型不是 void,那么标准会说“尝试将这些操作数中的每一个转换为另一个操作数的类型”并且它详细介绍了那是什么意思。

作为参考,我所指的C++标准版本是N4296,所以它有点旧,但我认为这不重要。