C++ "return"表达式的结果
C++ "return" the result of an expression
基于额外的括号,下面两个返回语句之间的表达式计算之间有什么区别吗?
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);}
这实际上给了你一个悬而未决的参考。
总结:除非你想要上述一些行为,否则不要使用括号,并且可能只有这样才附上支持性注释。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- C++ "return"表达式的结果