结果括号中的括号是否在返回语句中显着?

时间:2011-01-21 18:56:03

标签: c++ c semantics

函数中这两个语句之间有区别吗?

bool returnValue = true;

//Code that does something

return(returnValue);

这个?

bool returnValue = true;

//Code

return returnValue;

前者的括号为returnValue

11 个答案:

答案 0 :(得分:94)

从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++ Language Spec中,它被描述为:

  

指定将自动声明的变量类型   从初始化程序推断出来。对于函数,指定返回类型是尾随   返回类型或将从其返回语句中推断出来(自C ++ 14起)

同样,C ++ 11引入了C++ Language Spec中描述的decltype说明符:

  

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

     

[剪断]

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

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

         

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

         

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

         

    c)否则,decltype指定T

  4.         

    [剪断]

         

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

在C ++ 14中,函数返回类型允许使用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语句的entity / expression推导出来。在第一个版本return var1;实际上与返回类型decltype(var1)(上面的规则1的int返回类型)相同,而在第二个案例中return (var1);它是' s实际上与decltype((var1))(规则2b中的int &返回类型)相同。

括号使得返回类型int&而不是int,从而改变了语义。 故事的道德 - "并非所有返回类型的括号都是相同的"

答案 1 :(得分:5)

没有区别。

使用括号的一个原因是,如果您想在返回之前评估表达式,但在您的示例中,没有理由。参见:

Parenthesis surrounding return values

进一步讨论。

答案 2 :(得分:4)

AFAIK,没有什么不同。

在C ++中,表达式可以采用以下格式:expr(expr)。所以,后者是一个更多打字的表达。有关此内容的进一步阅读,请参阅a grammar(查找“表达式”)。

答案 3 :(得分:4)

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

它会像......一样......

int x = (5);

此处的括号也会被忽略。

答案 4 :(得分:3)

不,您的代码没有区别。

答案 5 :(得分:3)

我认为boo是一个错字,你问的是

之间是否存在差异
return expr;

return(expr);

答案是否定的。

答案 6 :(得分:2)

不是两者之间没有区别,尽管你可以包括括号,如果它使表达式易于阅读和清除。

答案 7 :(得分:1)

没有区别!!

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

BTW return是一个不是函数的语句。

答案 8 :(得分:0)

你滥用编译器的速度很慢!

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


从语义角度来看?它们完全相同。无论是否有括号,return语句将在返回之前完全评估表达式。

答案 9 :(得分:0)

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

直截了当地说,返回表达式的括号被那些不完全掌握类函数宏和函数之间的区别的人使用,或者对C中的运算符优先级或评估规则的顺序感到困惑。使用括号是没有编码风格的好处。

因此

return value;

更正确
return (value)

因为后者暗示你不太清楚你在做什么:)

答案 10 :(得分:-3)

两者在你的情况下都是一样的。