在 C + + 中函数声明之后不需要分号(’;’)吗?

我最近参加了一个中级编程测试,其中一个错误的问题是:

函数声明后不需要分号(’;’)。

真或假。

我选择了“ false”(如果我错了请纠正我,因为我觉得我要疯了) ,函数 声明是你在定义之前写的(在代码的顶部) ,所以编译器甚至在调用它之前就知道函数调用,而函数 定义是构成函数整体的东西。

也就是说,

声明:

int func();

定义:

int func() {
return 1;
}

这个问题的答案不应该是错误的吗?

21878 次浏览

您可能会遇到这样一种情况: 在一个步骤中声明和定义函数,也就是说,如果在声明函数的时候包含函数定义。所以 严格来说我认为 true 是正确的。但是这个问题的措辞我会像你一样回答。

你也可以像这样声明一个函数:

int func(){
return 1;
}

该语句非常模糊。正确答案应该是: 它取决于如何声明函数。

无论如何,我也会选择错误的,也许你可以向别人报告这个问题。

除了“一个定义也是一个声明”之外,以下是合法的 C + + :

int f(), g();

这里声明了两个函数,fg,它们都没有参数,返回类型为 int,但是 f的定义后面(立即)没有分号。同样,这也是合法的:

int f(), i = 42;

但是,在这些情况下,确实不允许完全省略分号,因此,如果将其中任何一个作为没有后面分号的声明的例子,都会有些令人惊讶。事实上,以下行为是违法的:

void *p, f() {}

除了函数声明之外,函数 定义不能与同一个 类型说明符的任何其他声明或定义组合。(如果这是合法的,它将同时定义 void *pvoid f() {}。)

在任何情况下,这似乎是一个不应该出现在中级编程测试中的“抓住你要点”类型的问题。

(哦,顺便说一句,请不要真的编写像 int f(), i = 42;这样的代码。)

其他的回答和评论从许多方面揭示了这是一个可怕的、误导性的、写得很糟糕的问题。但是还有一个问题没有人发现。问题是:

函数声明后不需要分号(’;’)。

好,让我们来看一个函数声明:

int func();       /* */
/*           ^       */
/*           |       */
/* That whitespace is "after the function declaration". */

整件事就是宣言。声明不是 int func(),然后是 然后是;。声明是 int func();,然后是空格。

所以,问题是: 分号是否需要 在宣布之后?当然没有。声明后面的分号是没有意义的。相比之下,int func(); ;将是一个分号 在函数声明之后

这个问题几乎可以肯定是 打算提出的“真或假: 函数声明中的最后一个标记总是一个分号”的问题,但这不是他们写的问题,因为这个测试的作者没有清楚地考虑这个问题。

我的建议是完全避免编程语言测试,它们非常糟糕。


有趣的是,在 C # 中,这些都是合法的:

class C {}
class D {};
struct E {}
struct F {};

在 C # 中,类或结构声明可以以分号结尾,也可以不以分号结尾。这个奇怪的小特性是为了 C/C + + 程序员的利益而添加的,C # 程序员的指尖上就有类型声明以一个毫无意义的分号结束; 设计团队不想因为他们有这个习惯而惩罚他们。:-)

这取决于我们是声明还是定义函数。 如果要声明函数,则需要包含分号(;) ,如果要定义函数,则不需要分号。

宣言是这样的:

int add(int, int);

定义是这样的:

int add(int a, int b)
{
// ...
}

很遗憾,你的问题没有说“直接后”,我们可以这样写:

int func()  /* My function */ ;

或者我可以写:

int func()
int a = 42;

在第一种情况下,分号不是 就在那之后的声明,但这样就可以了。

在第二种情况下,声明后面有一个分号,但不是直接在声明后面。

我认为埃里克 · 利伯特在 他的回答中的想法是正确的。

这就像在说“英语句子的结尾应该有句号吗?”.可以说,一个句子在结尾已经有句点了(否则它就不是一个句子了) ,因此这个句子不应该有句点 之后。.

尽管我同意几乎所有其他的回答,说这个问题的措辞非常模糊,你的答案在技术上是正确的,但请允许我给出一个不同的观点:

我一直这么称呼他们:

void func();  // The function prototype


...


void func()
{
// The function definition
}

我假设这个问题是根据这个术语编造出来的。

在我看来,定义和声明是同一个概念。“我定义 x = y”= = “我声明 x = y”。

当然,函数原型(在顶部)和函数的实际定义之间有很大的区别。

函数声明后不需要分号(’;’)。

真或假。

True 。在任何声明之后、任何定义之后、任何语句之后都不需要分号。

许多类型的声明必须以分号结束,正如第7节[ dcl.dcl ]中的语法所指定的那样。但在那之后,再也没有必要写第二本书了。

只能对原型使用 ;

分号(;)用于告诉编译器在这个分号(;)之后启动一个新语句。

因此,我认为分号(;)仅在函数声明期间是必需的。所以根据我的说法,答案是真的。

这是个棘手的问题,但他们用了 声明这个词,意思是这样的:

int example();

所以这次是真的。

如果他们用了 实施这个词,那就是假的。

当函数为 在 main ()之前定义时:

  • 不需要分号 ,因为函数已经定义好了

当函数为 在 main ()之后定义时:

  • 需要分号 ,因为您正在构建该函数的原型,并告诉编译器该函数已退出。