【发布时间】:2011-03-10 12:08:52
【问题描述】:
通常自动生成的 c++“main”函数在末尾p>
return (0);
或
return (EXIT_SUCCESS);
但是为什么上面的语句中有括号呢?是不是和C语言有关?
// 编辑
我知道这是正确的,但有人把这些括号放在一个原因。什么原因?!
【问题讨论】:
-
是的,你是对的,EXIT_SUCCESS,已更正。
标签: c++
通常自动生成的 c++“main”函数在末尾p>
return (0);
或
return (EXIT_SUCCESS);
但是为什么上面的语句中有括号呢?是不是和C语言有关?
// 编辑
我知道这是正确的,但有人把这些括号放在一个原因。什么原因?!
【问题讨论】:
标签: c++
它们不是必需的(即使在 c 中)。我认为有些人使用它们使“返回”看起来更像一个函数调用,认为它更一致。
编辑:生成器可能出于自身原因这样做。以这种方式工作可能更安全或更容易。
【讨论】:
#define X(x) (x-2x) 因为它通常会在您执行 3 * X(2) 时有所帮助。我想不出有什么好的理由这样做以获得回报。
但是为什么上面有括号 陈述?是否与C有关 语言什么的?
没有。据我所知,C 从未要求 return 语句使用括号。甚至在第一个 ANSI C 标准之前,情况似乎就是这样。
然而,这实际上是一个非常有趣的问题,因为我已经看到这种风格在某些 C 程序员中很流行。
我认为对于为什么会出现这种风格的最有可能的猜测是因为所有其他分支语句(for、while、if、switch)都需要在表达式周围加上括号。人们可能没有意识到他们可以省略 return 语句的括号,或者意识到了这一点,但希望获得更统一的代码外观。
三元?有些人可能会发现它可以在视觉上将表达式“组合”成一个单元。
我的第二个最佳猜测是这种风格受到当时流行的其他语言的影响。但是,当时流行的程序替代方案(例如 Pascal)也不需要这种语法(Pascal 甚至没有 C 意义上的返回值,而只有输出参数),所以如果是这种情况,我不知道有什么特别的语言这种风格的起源。
[主观]我更喜欢那些需要最少多余装饰的样式,无论是命名约定还是如何格式化,或者是否在不必要的地方使用额外的括号。我发现任何这样的装饰往往是一个独特的个人喜好问题,爱上一种装饰代码的方式只是意味着有一天你将不得不以一种完全不同的方式处理(除非你严格单独工作,在这种情况下我羡慕你)。 [/主观]
【讨论】:
这其实是对 BSD 内核源文件样式的要求。
man 9 style 说:
关键字后的空格(if、while、for、return、switch)。
和
return 语句中的值应该用括号括起来。
【讨论】:
由于可以将任何有效表达式传递给返回,因此可以根据需要添加这些括号。就像这样做:
int i = (0);
您可以将表达式嵌套在任意数量的括号中:
return (((((0)))));
【讨论】:
在 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;
}
【讨论】:
有一个愚蠢的原因 - 让 return 看起来更像一个函数调用。
有一个更聪明的原因 - 如果生成了代码,代码生成器通常会通过在表达式周围加上括号来“安全行事”,这样他们就不必担心优先级泄漏。
【讨论】:
只是我的愚蠢猜测:
#define RETURN(val) { if (val) printf("Main Exit With Error %d\n", val); return val; }
int main(argc, argv)
{
...
RETURN (E_FILENOTFOUND);
}
【讨论】:
return,而不是RETURN...有人试图采用一种统一的风格,既可以使用真正的关键字,也可以使用宏替换 - 这将模糊地证明其他无用的括号 - 将使用正确的大小写。如果使用不同的情况,那么他们肯定会记住只在必要时使用括号。
这些不是必需的。也许他们来自倾向于使用更多括号而不是更少括号when writing macros。
由于您提到了自动生成的代码,因此可能会发生用于生成宏的代码是通过重用生成宏的代码编写的,或者是由认为更多括号不会造成伤害但更少括号可能是致命的人编写的。
【讨论】:
我可以看到的一个原因:
return (ERROR_SUCCESS);
是它表达了ERROR_SUCCESS 是不透明的概念。我们都知道它是 0L,但我们不应该必须这样做。
这是一个相当薄弱的理由。
另一个原因是为了保持一致性,使用括号在美学上令人愉悦,这是另一个弱的原因。
所以换句话说,我自己不使用它,但如果其他人使用它也不会翻转。 :)
【讨论】:
ERROR_SUCCESS 是不透明的概念?这到底是什么意思?但无论它是什么,括号都无法改变它。