括号括起来的结果在return语句中有意义吗?

函数内部的这两个语句之间有区别吗?

bool returnValue = true;

//Code that does something

return(returnValue);

和这个?

bool returnValue = true;

//Code

return returnValue;

前者的括号大约为returnValue

Jose Villalta asked 2019-10-09T15:15:33Z
12个解决方案
88 votes

从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))

在第一个int&中返回int,在第二个decltype(var1)中返回int。 语义上的差异与周围的括号直接相关。

C ++ 11中引入了最新形式的int&说明符。 在C ++语言规范中,它描述为:

指定将被自动声明的变量的类型   从其初始值设定项推导。 对于函数,指定返回类型为尾随   返回类型,或从其return语句推导(自C ++ 14起)

同样,C ++ 11引入了int&说明符,该说明符在C ++语言规范中进行了描述:

检查实体的声明类型或查询表达式的返回类型。

[片段]

  1. 如果参数是对象/函数的未括号名称,或者是成员访问表达式(object.member或pointer-> member),则decltype指定此表达式指定的实体的声明类型。

  2. 如果参数是类型T的任何其他表达式,则

    a)如果表达式的值类别是xvalue,则decltype指定T &&

    b)如果表达式的值类别是左值,则decltype指定T&

    c)否则,decltype指定T

[片段]

请注意,如果将对象的名称加上括号,则该对象将成为左值表达式,因此decltype(arg)和decltype((arg))通常是不同的类型。

在C ++ 14中,对于函数返回类型,允许使用int&。 原始的示例是括号之间的语义差异起作用的地方。 回顾原始示例:

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&允许从return语句上的实体/表达式推导函数中的尾随返回类型。 在第一个版本中int实际上与返回类型decltype(var1)(根据上面的规则1返回int的返回类型)相同,在第二种情况下,与return (var1);(与根据规则2b返回的decltype((var1))则实际上相同)相同。

括号使返回类型为int&,而不是int,从而改变了语义。 故事的寓意-“并非所有返回类型的括号都相等”

Michael Petch answered 2019-10-09T15:17:59Z
12 votes

是的,一个返回bool,而另一个返回boo ...


编辑后:

不,他们是一样的。

peoro answered 2019-10-09T15:18:47Z
5 votes

没有区别。

使用括号的原因之一是,如果您想在返回之前对表达式求值,但是在您的示例中,没有理由。 看到:

括号内的返回值

有待进一步讨论。

Karl Rosaen answered 2019-10-09T15:19:39Z
4 votes

AFAIK,没什么不同。

在C ++中,表达式可以采用以下形式:25618254270693386386或(expr)。因此,后者是具有更多类型的表达式。 有关此内容的更多信息,请参阅语法(查找“表达式”)。

Weiser answered 2019-10-09T15:20:20Z
4 votes

上面例子的括号是多余的; 他们实际上被忽略了。

就像...

int x = (5);

这里的括号也被忽略。

James answered 2019-10-09T15:21:07Z
3 votes

不,您的代码没有区别。

Elalfer answered 2019-10-09T15:21:35Z
3 votes

我假设boo是错别字,而您是在问两者之间是否有区别

return expr;

return(expr);

答案是不。

aschepler answered 2019-10-09T15:22:16Z
2 votes

不会,两者之间没有区别,尽管如果可以使表达式易于阅读和清除,则可以加上括号。

sanchit.h answered 2019-10-09T15:22:50Z
1 votes

没有不同!!

如果涉及复杂的表达式,人们会使用括号。

BTW return是不是函数的语句。

Prasoon Saurav answered 2019-10-09T15:23:37Z
0 votes

您正在滥用编译器的速度!

括号的存在不仅减慢了预处理阶段,而且还生成了更复杂的抽象语法树:更多的内存,更多的计算。


从语义上看? 它们是完全相同的。 return语句是否带括号将在返回之前完全评估表达式。

Matthieu M. answered 2019-10-09T15:24:26Z
0 votes

它们是相同的。 我经常看到括号语法,并且我总是问使用它的人:为什么? 没有人能回答他们为什么使用它。

简而言之,那些不太了解函数式宏和函数之间的区别,或者对C中的运算符优先级或评估规则的顺序感到困惑的人会使用返回表达式的括号。 样式受益于括号。

从而

return value;

比以下更正确

return (value)

因为后者表明您不太了解自己在做什么:)

Lundin answered 2019-10-09T15:25:36Z
-3 votes

两者在您的情况下是相同的。

Zeshan Khan answered 2019-10-09T15:26:06Z
translate from https://stackoverflow.com:/questions/4762662/are-parentheses-around-the-result-significant-in-a-return-statement