Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回语句中结果周围的括号是否重要?_C++_C_Semantics - Fatal编程技术网

C++ 返回语句中结果周围的括号是否重要?

C++ 返回语句中结果周围的括号是否重要?,c++,c,semantics,C++,C,Semantics,函数中这两个语句之间有区别吗 bool returnValue = true; // Code that does something return(returnValue); 这个呢 bool returnValue = true; // Code return returnValue; 前者在returnValue周围有括号,没有区别 如果涉及复杂的表达式,人们会使用括号 顺便说一句,return是一个语句而不是函数。没有区别 使用括号的一个原因是,如果您想在返回表达式之前对表达式求值,

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

bool returnValue = true;
// Code that does something
return(returnValue);
这个呢

bool returnValue = true;
// Code
return returnValue;
前者在
returnValue

周围有括号,没有区别

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


顺便说一句,return是一个语句而不是函数。

没有区别

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


供进一步讨论。

不,您的代码没有差异。

我假设
boo
是一个打字错误,您会问

return expr;


答案是否定的。好吧,没什么不同


在C++中,表达式可以有如下形式:<代码> EXPR或(EXPR)。因此,后者是一个类型更多的表达式。要进一步了解这一点,请参阅(查找“表达式”)。

上例中的括号是多余的;他们实际上被忽视了

这将是一样的东西像

int x = (5);

这里的括号也会被忽略。

不,两者之间没有区别,不过如果括号使表达式易于阅读和清除,则可以包含括号。

您滥用了编译器的速度

括号的存在不仅会降低预处理阶段的速度,还会生成更复杂的抽象语法树:更多内存,更多计算



从语义的角度看?它们完全相同。无论是否有括号,
return
语句都将在返回表达式之前对其进行完全求值。

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

直截了当地总结一下,返回表达式周围使用括号的人不太了解函数(如宏和函数)之间的区别,或者对C中的运算符优先级或求值规则的顺序感到困惑。使用括号没有编码风格的好处

因此

比…更正确

return (value)
因为后者表明您不太清楚自己在做什么:)

从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++14开始)

C++11还引入了
decltype
说明符,如中所述:

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

[剪报]

  • 如果参数是对象/函数的未解析名称,或者是成员访问表达式(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语句上的实体/表达式推断函数中的尾部返回类型。在第一个版本中
    返回var1
    实际上与返回类型
    decltype(var1)
    (根据上面的规则1,返回类型为
    int
    ),在第二种情况下,返回类型为
    var1)
    它实际上与
    decltype((var1))
    (规则2b中的
    int&
    返回类型)相同


    括号使返回类型为
    int&
    而不是
    int
    ,因此语义发生了变化故事的寓意——“并非返回类型上的所有括号都是相等的”

    这两个括号在您的情况下都是相同的。

    尽管使用复杂的表达式,但这些括号仍然不会导致不同的行为。它们只是让人类读者(主观上)更清楚地理解它的意思。@Karl“使用括号的一个原因是,如果你想在返回之前对表达式求值,”你能举个例子吗?@ChrisMiddleton没有,因为这种说法在这里和在那条线索中一样荒谬。在
    return m*x+c
    return(m*x+c)
    return((m*x)+c)
    等之间没有任何功能上的区别。如果你问我的话,它看起来也不会更好或更直观。从技术上讲,它们不会被忽略,它们只是对表达式的值没有影响。@John:实际上被忽略了。:)+1…这是唯一说明括号实际上是多余的并显示
    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 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))