返回语句中的结果是否有重要的括号?
这两个语句在函数内部有区别吗?
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&
。 语义上的差异与周围的括号直接相关 。
最新forms的auto
说明符是在C ++ 11中引入的。 在C ++语言规范中,它被描述为:
指定正在声明的variables的types将自动从其初始值设定项中推导出来。 对于函数,指定返回types是尾随返回types,或者从返回语句中推导出(自C ++ 14以来)
C ++ 11引入了C ++语言规范中描述的decltype
说明符:
检查实体的声明types或查询expression式的返回types。 [snip] 1.如果参数是对象/函数的非名称名称,或者是成员访问expression式(object.member或pointer-> member),则decltype指定由此expression式指定的实体的声明types。
如果参数是T型的任何其他expression式
a)如果expression式的值类别是xvalue,则decltype指定T &&
b)如果expression式的值类别是左值,则decltype指定T&
c)否则,decltype指定T
[剪断]
请注意,如果一个对象的名称被括起来,它将成为一个左值expression式,因此decltype(arg)和decltype((arg))通常是不同的types。
在C ++ 14中,允许使用decltype(auto)
的函数返回types。 原来的例子是与括号的语义差别发挥的地方。 重温原始的例子:
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)
允许函数中的结尾返回types从return语句的实体/expression式中推导出来。 在第一个版本中return var1;
与返回typesdecltype(var1)
(上面的规则1的一个int
返回types)和第二个return (var1);
它与decltype((var1))
(通过规则2b的int &
返回typesdecltype((var1))
实际上是相同的。
括号使返回typesint&
而不是int
,从而改变了语义。 道德的故事 – “并非所有返回types的圆括号都是平等的”
是的,一个返回一个bool
,而另一个boo
…
编辑完成后:
不,他们是一样的。
没有区别。
使用括号的一个理由是如果你想在返回之前评估一个expression式,但是在你的例子中,没有理由。 看到:
包围返回值的括号
进一步讨论。
上面例子的括号是多余的; 他们被有效地忽略了。
这将是一样的东西一样…
int x = (5);
这里的括号也被忽略。
AFAIK,没有什么不同。
在C ++中,expression式的forms可以是: expr
或(expr)
。 所以,后者是一个更多的打字expression。 有关这方面的进一步阅读,请参阅语法 (查找“expression式”)。
你在滥用编译器!
括号的存在不仅减慢了预处理阶段,而且还产生了更复杂的抽象语法树:更多的内存,更多的计算。
从语义的angular度来看? 他们完全一样。 return
语句是否有括号,在return
之前会对expression式进行全面的评估。
不,你的代码没有区别。
我认为boo
是一个错字,你问是否有区别
return expr;
和
return(expr);
答案是不。
他们是相同的。 我经常看到括号的语法,我总是问使用它的人: 为什么 ? 没有人能回答他们为什么使用它。
直截了当地说,围绕着返回expression式的括号被那些不太了解函数式macros和函数之间的区别,或者在C语言中对运算符的优先顺序或者评价规则的顺序感到困惑的人所使用。没有编码风格受益于使用括号。
从而
return value;
比…更正确
return (value)
因为后者表明你不太清楚你在做什么:)
不,两者之间没有区别,但是如果使expression式易于阅读和清除,则可以包含括号。
没有不同!!
如果涉及复杂的expression式,人们使用括号。
BTW return
是一个声明不是一个函数。
两者在你的情况是一样的。