C++ 返回语句中结果周围的括号是否重要?
函数中这两个语句之间有区别吗C++ 返回语句中结果周围的括号是否重要?,c++,c,semantics,C++,C,Semantics,函数中这两个语句之间有区别吗 bool returnValue = true; // Code that does something return(returnValue); 这个呢 bool returnValue = true; // Code return returnValue; 前者在returnValue周围有括号,没有区别 如果涉及复杂的表达式,人们会使用括号 顺便说一句,return是一个语句而不是函数。没有区别 使用括号的一个原因是,如果您想在返回表达式之前对表达式求值,
bool returnValue = true;
// Code that does something
return(returnValue);
这个呢
bool returnValue = true;
// Code
return returnValue;
前者在returnValue
周围有括号,没有区别
如果涉及复杂的表达式,人们会使用括号
顺便说一句,return是一个语句而不是函数。没有区别 使用括号的一个原因是,如果您想在返回表达式之前对表达式求值,但在您的示例中,没有任何原因。见:
供进一步讨论。不,您的代码没有差异。我假设
boo
是一个打字错误,您会问
return expr;
及
答案是否定的。好吧,没什么不同
在C++中,表达式可以有如下形式:<代码> EXPR或
int x = (5);
这里的括号也会被忽略。不,两者之间没有区别,不过如果括号使表达式易于阅读和清除,则可以包含括号。您滥用了编译器的速度 括号的存在不仅会降低预处理阶段的速度,还会生成更复杂的抽象语法树:更多内存,更多计算
从语义的角度看?它们完全相同。无论是否有括号,
return
语句都将在返回表达式之前对其进行完全求值。它们是相同的。我经常看到括号语法,我总是问那些使用它的人:为什么?没有人能回答他们为什么使用它
直截了当地总结一下,返回表达式周围使用括号的人不太了解函数(如宏和函数)之间的区别,或者对C中的运算符优先级或求值规则的顺序感到困惑。使用括号没有编码风格的好处
因此
比…更正确
return (value)
因为后者表明您不太清楚自己在做什么:)从C++14开始,它们通常是这样的。
C++14添加了一个附带的情况,即返回值周围的括号可能会改变语义。此代码段显示了两个声明的函数。唯一的区别是返回值周围的括号
int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))
在第一个func1
中返回一个int
,在第二个func1
中返回一个int&
语义上的差异与周围的括号直接相关
最新形式的auto
说明符是在C++11中引入的。在本文中,它被描述为:
指定要声明的变量类型将自动
从它的初始值推导而来。对于函数,指定返回类型为尾随类型
返回类型或将从其返回语句中推导(从C++14开始)
C++11还引入了decltype
说明符,如中所述:
检查实体的声明类型或查询表达式的返回类型
[剪报]
decltype(auto)
。最初的例子是括号的语义差异发挥作用的地方。重温原始示例:
int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))
decltype(auto)
允许从return语句上的实体/表达式推断函数中的尾部返回类型。在第一个版本中返回var1
实际上与返回类型decltype(var1)
(根据上面的规则1,返回类型为int
),在第二种情况下,返回类型为var1)
它实际上与decltype((var1))
(规则2b中的int&
返回类型)相同
括号使返回类型为
int&
而不是int
,因此语义发生了变化故事的寓意——“并非返回类型上的所有括号都是相等的”这两个括号在您的情况下都是相同的。尽管使用复杂的表达式,但这些括号仍然不会导致不同的行为。它们只是让人类读者(主观上)更清楚地理解它的意思。@Karl“使用括号的一个原因是,如果你想在返回之前对表达式求值,”你能举个例子吗?@ChrisMiddleton没有,因为这种说法在这里和在那条线索中一样荒谬。在return m*x+c
和return(m*x+c)
或return((m*x)+c)
等之间没有任何功能上的区别。如果你问我的话,它看起来也不会更好或更直观。从技术上讲,它们不会被忽略,它们只是对表达式的值没有影响。@John:实际上被忽略了。:)+1…这是唯一说明括号实际上是多余的并显示
int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))
int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))