这是 ?三元运算合法吗?
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++ 吗?
如果编译通过,它可能是格式正确的代码。如果三元运算符由于它们的类型而不能与这些操作数一起使用,编译器将发出错误消息。没有此类错误消息表明您的代码不存在此类问题。
但是,在某些情况下,使用三元运算符可能会导致意外复制。
如果on
和off
方法都return void
(或者说bool
)就不会有任何复制问题,代码将按预期工作:如果 lockout[idx]
为真,则 bulb[idx].off()
将被计算,否则 bulb[idx].on()
将被计算。只会评估两个备选方案中的一个,就像 if
语句会发生的情况一样。
一般情况下,三元运算符用于需要结果为表达式的情况。否则,使用 if
语句编写代码通常更具可读性。
是的,这是合法的 C++。虽然该运算符通常称为 三元运算符 ,但它在 C++ 标准中称为 条件运算符 ,并且在名为“的部分中定义expr.cond".
C++ 标准明确表示第二个和第三个操作数的类型都可以是 void
。所以标准编写者知道人们可能希望使用此运算符作为编写 if
语句的简短方法,就像您正在做的那样。
如果第二个或第三个操作数的类型不是 void
,那么标准会说“尝试将这些操作数中的每一个转换为另一个操作数的类型”并且它详细介绍了那是什么意思。
作为参考,我所指的C++标准版本是N4296,所以它有点旧,但我认为这不重要。
我不是专家,但我确实喜欢学习和理解。考虑到这一点,我在 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++ 吗?
如果编译通过,它可能是格式正确的代码。如果三元运算符由于它们的类型而不能与这些操作数一起使用,编译器将发出错误消息。没有此类错误消息表明您的代码不存在此类问题。
但是,在某些情况下,使用三元运算符可能会导致意外复制。
如果on
和off
方法都return void
(或者说bool
)就不会有任何复制问题,代码将按预期工作:如果 lockout[idx]
为真,则 bulb[idx].off()
将被计算,否则 bulb[idx].on()
将被计算。只会评估两个备选方案中的一个,就像 if
语句会发生的情况一样。
一般情况下,三元运算符用于需要结果为表达式的情况。否则,使用 if
语句编写代码通常更具可读性。
是的,这是合法的 C++。虽然该运算符通常称为 三元运算符 ,但它在 C++ 标准中称为 条件运算符 ,并且在名为“的部分中定义expr.cond".
C++ 标准明确表示第二个和第三个操作数的类型都可以是 void
。所以标准编写者知道人们可能希望使用此运算符作为编写 if
语句的简短方法,就像您正在做的那样。
如果第二个或第三个操作数的类型不是 void
,那么标准会说“尝试将这些操作数中的每一个转换为另一个操作数的类型”并且它详细介绍了那是什么意思。
作为参考,我所指的C++标准版本是N4296,所以它有点旧,但我认为这不重要。