函数内部的这两个语句之间有区别吗?
bool returnValue = true;
// Code that does something
return(returnValue);
还有这个?
bool returnValue = true;
// Code
return returnValue;
前者周围有括号returnValue
。
函数内部的这两个语句之间有区别吗?
bool returnValue = true;
// Code that does something
return(returnValue);
还有这个?
bool returnValue = true;
// Code
return returnValue;
前者周围有括号returnValue
。
c++
/都很难回答这个问题c
。最好在语言定义上更具体,但我不知道9年后如何解决。
C
那里有一个重复的stackoverflow.com/questions/161879/…–
Answers:
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 ++ 14起)
同样,C ++ 11引入了decltype
在C ++语言规范中描述的说明符:
检查实体的声明类型或查询表达式的返回类型。
[片段]
如果参数是对象/函数的未括号名称,或者是成员访问表达式(object.member或pointer-> member),则decltype指定此表达式指定的实体的声明类型。
如果参数是类型T的任何其他表达式,则
a)如果表达式的值类别是xvalue,则decltype指定T &&
b)如果表达式的值类别为左值,则decltype指定T&
c)否则,decltype指定T
[片段]
请注意,如果将对象的名称加上括号,则该对象将成为左值表达式,因此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语句上的实体/表达式推导函数中的尾随返回类型。在第一个版本中,return var1;
它实际上与返回类型相同decltype(var1)
(int
上述规则1的返回类型),而在第二种情况下,return (var1);
它实际上与返回类型(规则2bdecltype((var1))
的int &
返回类型)相同。
括号使返回类型int&
代替int
,从而改变了语义。故事的寓意-“并非所有返回类型的括号都相等”
return (x);
等于return &x;
,也不应该导致返回。 x的值,但类型引用为x。
auto
经常使用。只要我们远离,语义就不会改变decltype
吗?当我们转到包含下一个Visual Studio的下一个编译器版本时,我担心会发生意外的行为。
return m * x + c
和return (m * x + c)
或return ( (m * x) + c )
等等之间没有功能上的区别。-如果您问我,它看起来也不会更好或更直观。
上面例子的括号是多余的;他们实际上被忽略了。
就像...
int x = (5);
这里的括号也被忽略。
AFAIK,没什么不同。
在C ++中,表达式可以采用以下形式:expr
或(expr)
。因此,后者是具有更多类型的表达式。有关此内容的更多信息,请参阅语法(查找“表达式”)。
不会,两者之间没有区别,尽管如果可以使表达式易于阅读和清除,则可以加上括号。
return
是一个贪婪的运算符,并且return m * x + c
可能会返回m
并丢弃其余的运算符?
您正在滥用编译器的速度!
括号的存在不仅减慢了预处理阶段,而且还生成了更复杂的抽象语法树:更多的内存,更多的计算。
从语义上看?它们是完全相同的。不管是否有括号,该return
语句都会在返回表达式之前对表达式进行完全求值。
两者在您的情况下是相同的。
a
是,5
则return a++;
和return (a++);
(相同)都将返回5