c++ 如何计算这个布尔表达式?

dohp0rv5  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(137)

在C++中,使用以下构造:

template<typename ValueType>
ValueType * func(Foo * foo)
{
    Bar bar;
    return foo && typeid(foo) == typeid(ValueType) ? &static_cast<ValueType*>bar : 0;
}

return语句是如何求值的?像这样吗?

if ((bar && typeid(bar)) == typeid(ValueType))
    return &static_cast<ValueType*>bar
return false;
rt4zxlrg

rt4zxlrg1#

foo && typeid(foo) == typeid(ValueType) ? &static_cast<ValueType*>bar : 0;

...在static_cast<>后用括号更正,计算为...

(foo && (typeid(foo) == typeid(ValueType))) ? (&(static_cast<ValueType*>(bar))) : 0;

优先级规则列在here中。请注意,?:三元运算符在此列表中的优先级为15-低于您使用的其他运算符,因此它定义了计算的外部结构。&&的优先级比==的优先级9低13级。(我不认为这些数字在标准中的任何地方都有使用,但是它们是在cppreference表中指出事情的方便参考)。

uqcuzwp8

uqcuzwp82#

发布的答案正确地解决了 * 运算符优先级 * 问题:

(foo && (typeid(foo) == typeid(ValueType))) ? (&(static_cast<ValueType*>(bar))) : 0;

这就是表达式的解析方式--编译器将哪些操作数视为属于哪个运算符,但这并没有说明表达式的求值方式(基本上是"执行"),因此它没有回答以下问题:
如何计算这个布尔表达式?
表达式 * 计算 * 为:

  • foo被求值。
  • 如果false,则(typeid(foo) == typeid(ValueType))将 * 不 * 被求值,并且整个子表达式将被求值为false
  • 如果true,则(typeid(foo) == typeid(ValueType))将被求值。==的两个操作数都将被求值(如果适用,则调用重载运算符)。如果整个表达式为true,则&&的结果也为true
  • 如果上一次求值的结果是true,则将求值第二个操作数(&(static_cast<ValueType*>(bar)))
  • 否则,如果先前评估的结果是false,则将评估第三操作数0

值得注意的是,?:的第二个和第三个操作数需要是相同的类型。在指针的情况下,这意味着完全相同的类型,尽管如果一个操作数是空指针,在这种情况下,结果将是另一个操作数的类型。在算术类型的情况下,第二个和第三个操作数将获得"平衡",按照通常的算术转换。
表达式&static_cast<ValueType*>bar在很多方面都很可疑,除了缺少括号,你不能将bar转换为指针类型,而且你也不应该在类型之间使用wild type双关语。

相关问题