在“return(0);”中0附近的括号'main'函数中的语句 - 它们用于什么?

时间:2010-07-01 07:26:35

标签: c++

通常自动生成的c ++“main”函数最后有

return (0);

return (EXIT_SUCCESS);

但为什么上述陈述中有括号?它与C语言有关吗?

//编辑

我知道这是正确的,但有人把这些括号放在原因之内。是什么原因?!

9 个答案:

答案 0 :(得分:10)

不需要它们(即使在c中)。我认为有些人使用它们使'返回'看起来更像是函数调用,认为它更一致。

编辑:发生器很可能因为它自己的原因而这样做。以这种方式工作可能更安全或更容易。

答案 1 :(得分:9)

  

但为什么上面有括号   声明?它与C有关吗?   语言还是什么?

没有。据我所知,C从来没有要求括号用于return语句。即使在第一个ANSI C标准之前,情况似乎也是如此。

然而,这实际上是一个非常有趣的问题,因为我已经看到某些C程序员普遍存在这种风格。

我认为最有可能猜测出这种风格的原因是因为所有其他分支语句(for,while,if,switch)需要围绕表达式括起来。人们可能没有意识到他们可以省略返回语句的括号或者意识到这一点,但希望对他们的代码实现更统一的外观。

三元?:运算符是一个例外,因为它是一个运算符,并且不需要围绕条件表达式的括号,但是人们经常在那里写括号而不管它是否需要。有些人可能会发现它可以直观地将表达式“分组”到一个单元中。

我的第二个最好的猜测是,这种风格受到当时流行的其他语言的影响。然而,当时流行的,程序化的替代方案,如Pascal也不需要语法(Pascal甚至没有C语义中的​​返回值,只有输出参数)所以如果是这种情况,我不知道任何特定的语言从这种风格起源。

[主观]我更喜欢需要对代码进行最少量多余装饰的样式,无论是命名约定还是如何格式化,或者是否在不必要的地方使用额外的括号。我发现任何这样的装饰往往是一个独特的个人偏好问题,并且爱上一种装饰代码的方式只意味着有一天你将不得不以完全不同的方式处理(除非你严格单独工作,在这种情况下我羡慕你)。 [/主观]

答案 2 :(得分:7)

这实际上是BSD内核源文件样式的要求。

man 9 style说:

  

关键字后的空格(if,while,for,返回,切换)。

  

return语句中的值应括在括号中。

答案 3 :(得分:5)

由于任何有效的表达式都可以传递给return,因此可以根据需要添加这些括号。这就像这样:

int i = (0);

您可以根据需要在任意多个括号中嵌套表达式:

return (((((0)))));

答案 4 :(得分:5)

随着在c ++ 14中使用decltype(auto)来推断返回类型,事情发生了变化。如果使用括号,则推断返回的类型为引用:

decltype(auto) foo1() {
   int n;
   return (n); // parentheses causes return type to be int&
}

decltype(auto) foo2() {
   int n;
   return n; // no parentheses causes return type to be int
}

template<typename T> struct TD;

int main()
{
  // main.cpp:19:22: error: aggregate 'TD<int&()> f1' has incomplete type and cannot be defined TD<decltype(foo1)> f1;
  TD<decltype(foo1)> f1;

  // main.cpp:20:22: error: aggregate 'TD<int()> f2' has incomplete type and cannot be defined TD<decltype(foo2)> f2;
  TD<decltype(foo2)> f2;
}

答案 5 :(得分:2)

这些不是必需的。也许他们倾向于更喜欢更多括号when writing macros

由于您提到自动生成的代码,可能会发生用于生成宏的代码是通过重用代码生成宏来编写的,或者是由一个认为更多括号不会受到影响的人编写的,但更少的括号可能是致命的。< / p>

答案 6 :(得分:2)

答案 7 :(得分:1)

只是我的愚蠢猜测:

#define RETURN(val) { if (val) printf("Main Exit With Error %d\n", val); return val; }

int main(argc, argv)
{
  ...
  RETURN (E_FILENOTFOUND);
}

答案 8 :(得分:0)

我能看到的一个原因是:

return (ERROR_SUCCESS);

是表达ERROR_SUCCESS不透明的概念。我们都知道它是0L,但我们不应该拥有

这是一个相当薄弱的原因。

另一个原因是使用括号来保持一致性是美学上令人愉悦的另一个弱理由。

换句话说,我不会自己使用它,但如果其他人这样做,就不会发现它。 :)