在函数内部,这两个语句有什么区别吗?
bool returnValue = true;
// Code that does something
return(returnValue);
还有这个?
bool returnValue = true;
// Code
return returnValue;
前者在returnValue
周围有括号。
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++语言规范中它被描述为:
此外,C++11还引入了在C++语言规范中描述的指定正在声明的变量的类型将根据其初始化器自动推断出来。对于函数,指定返回类型是尾部返回类型,或将从其返回语句中推断出来(自C++14起)
decltype
关键字: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
返回类型),而在第二个情况下,return (var1);
实际上等同于decltype((var1))
(根据规则2b是int &
返回类型)。
括号使返回类型变为int&
而不是int
,因此改变了语义。故事的寓意是 - "并非所有返回类型上的括号都是相等的"
return(x);
等同于return&x;
绝不应该是这种情况,也不应该导致返回x的值,但类型为对x的引用。 - Theodore Murdockauto
。只要我们远离decltype
,我们的语义就永远不会改变吗?当我们转移到下一个包含下一个Visual Studio版本的编译器版本时,我担心会出现意外行为。 - OneWorldreturn m * x + c
、return (m * x + c)
、return ((m * x) + c)
等表达方式没有任何实际区别,并且在我看来它也不会更好或更直观。请注意,这里不会添加解释或额外的内容。 - underscore_dint x = (5);
据我所知,没有什么不同。
在C++中,表达式可以采用以下形式:expr
或(expr)
。因此,后者是打字更多的表达式。有关此内容的进一步阅读,请参考语法(查找“expression”)。
不,你的代码没有任何区别。
没有区别!!
如果涉及到复杂表达式,人们会使用括号。
顺便说一下,return
是一个语句而不是函数。
这两者之间没有区别,不过如果加上括号可以使表达更易读和清晰。
return
是一个贪婪的运算符,而return m * x + c
可能会返回m
并丢弃其余部分,或者还有其他原因? - underscore_d你在滥用地减慢编译器的速度!
括号的存在不仅会减慢预处理阶段,还会生成更复杂的抽象语法树:需要更多的内存和计算。
从语义角度来看,它们完全相同。无论是否有括号,return
语句都会在返回之前完全评估表达式。
if
、for
或while
语句中没有圆括号,也不需要。但是函数参数周围的括号更难去掉:f 3 + 4
应该解析为f(3) + 4
还是f(3 + 4)
?可以使用优先级,但优先级规则很容易变得混乱。 - Matthieu M.它们是相同的。 我经常看到括号语法,并且我总是问那些使用它的人:为什么?没有人能够回答为什么他们使用它。
bluntly sum it up,将返回表达式括在括号中的人不太理解类似函数的宏和函数之间的区别,或者对C中的运算符优先级或评估顺序规则感到困惑。从使用括号中没有编码样式的好处。
因此
return value;
比起
更正确。
return (value)
因为后者暗示着你不太知道自己在做什么 :)
return
是一个跳转语句,而不是选择或迭代语句。因此,它应该与 goto
、break
和 continue
进行比较,而不是其他任何东西。你在使用 goto
、break
或 continue
时是否使用括号?如果是,那么你是如何在语法上管理的呢? - Lundinreturn
和if
,则return
的正式语法为: return
expression;
。 if
的正式语法是if (
expression)
。 不管你喜欢与否,这就是语言的设计。 if
通过正式语法定义要求括号。 - Lundin在你的情况下,两者是相同的。
a
是 5
,那么 return a++;
和 return (a++);
(两者相同)都会返回 5
。 - M.M
c++
/c
程序员来说都很困难。更具体地说明语言定义会更好,但是9年后我不知道如何解决这个问题。 - Jonas SteinC
,这里有一个重复的问题:https://dev59.com/GHVC5IYBdhLWcg3w21Iq - Jonas Stein