基于额外的括号,以下两个return语句之间的表达式求值之间是否有区别?
return a++ *(-b+123.456)/999.12344;
vs
return (a++ *(-b+123.456)/999.12344);
编程语言C ++ 标准CPP 98'ish(在C ++ 11之前)
希望问题很明确。期望对表达进行全面评估。
答案 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()
在C ++ 17之前,您可能会观察到相同的结果,因为编译器一直试图优化返回值。即使在您的标准C ++ 98中,您也可能会观察到在第一种情况下不会调用复制构造函数。
但是,嘿,这些都与简单的算术表达式无关。