C++ "return"表达式的结果

C++ "return" the result of an expression

本文关键字:结果 return C++ 表达式      更新时间:2023-10-16

基于额外的括号,下面两个返回语句之间的表达式计算之间有什么区别吗?

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

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

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

希望问题清楚。期望是完整地评估表达式。

邋遢的口语x(x)相同(有关"严格说话"的答案,请参阅此答案;)。在完整表达式周围添加括号不会更改有关运算符优先级的任何内容。

PS:它对返回值优化的影响不大(详见此答案)。但是,它绝对对返回的值没有影响。

基于额外的括号,下面两个 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 1n------n";
    foo();
    std::cout << 'n';
    std::cout << "Test 2n------n";
    bar();
}

输出:

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

(现场演示)

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

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

有差异。使用括号避免返回值优化

例如,如果a和/或b是所有合适运算符重载的对象,那么使用括号可能会遭受对象值复制的开销。

对于普通的旧数据没有区别,受制于 C++11 可憎之物

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

这实际上给了你一个悬而未决的参考

总结:除非你想要上述一些行为,否则不要使用括号,并且可能只有这样才附上支持性注释。