C ++“返回”表达式的结果

时间:2019-01-18 14:38:13

标签: c++ c++98

基于额外的括号,以下两个return语句之间的表达式求值之间是否有区别?

    return a++ *(-b+123.456)/999.12344;

vs

    return (a++ *(-b+123.456)/999.12344);

编程语言C ++ 标准CPP 98'ish(在C ++ 11之前)

希望问题很明确。期望对表达进行全面评估。

3 个答案:

答案 0 :(得分:4)

口语x(x)相同(有关“口语严格”的答案,请参见this answer)。在完整表达式周围加上括号不会更改operator precedence

PS:它对返回值优化没有明显的影响(有关详细信息,请参见this answer)。不过,它绝对对返回的值没有影响。

答案 1 :(得分:3)

有区别。使用括号 可以消除返回值优化

例如,如果a和/或b是所有合适的运算符都已重载的对象,那么使用括号可能会浪费对象值副本的开销。

对于普通旧数据,没有区别,但受到C ++ 11的憎恶

decltype(auto) ub_server() { int a; return (a);}

实际上为您提供了悬挂参考

总结:除非您想要上述某些行为,否则不要使用括号,并且可能只有这样才能提供支持的注释。

答案 2 :(得分:2)

  

基于额外的括号,以下两个return语句之间的表达式求值之间是否有区别?

否;在这种情况下,括号是完全多余的。


表达式expr实际上与表达式(expr)不同,您可以使用return来观察它,因为在后一种情况下禁止复制/移动省略:

#include <iostream>

struct T
{
    T() { std::cout << "T()\n"; }
    T(const T&) { std::cout << "T(const T&)\n"; }
    T(T&&) { std::cout << "T(T&&)\n"; }
    ~T() { std::cout << "~T()\n"; }
};

T foo()
{
    T t;
    return t;
}

T bar()
{
    T t;
    return (t);
}

int main()
{
    std::cout << "Test 1\n------\n";
    foo();
    std::cout << '\n';
    std::cout << "Test 2\n------\n";
    bar();
}

输出:

Test 1
------
T()
~T()

Test 2
------
T()
T(T&&)
~T()
~T()

live demo

在C ++ 17之前,您可能会观察到相同的结果,因为编译器一直试图优化返回值。即使在您的标准C ++ 98中,您也可能会观察到在第一种情况下不会调用复制构造函数。

但是,嘿,这些都与简单的算术表达式无关。