在C ++中进行函数声明后,不需要分号(';')吗?

时间:2019-02-20 16:14:24

标签: c++ function syntax declaration

我最近刚刚参加了一次中间编程测试,我弄错了一个问题,如下所示:

  

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

     

对还是错。

我选择了“ false”(如果我错了,请纠正我,因为我觉得自己快疯了),在定义之前您要编写一个函数 declaration (在顶部)代码)),因此编译器甚至在调用函数之前就已经知道了函数调用,而函数定义是组成函数整体的。

声明:

int func();

定义:

int func() {
  return 1;
}

答案不对吗?

12 个答案:

答案 0 :(得分:163)

您可能会遇到一步声明和定义函数的情况,即是否在声明函数的位置包括了函数定义。所以从技术上来说我认为true是正确的。但是问题的措词使我会像您一样回答。

答案 1 :(得分:148)

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

int f(), g();

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

int f(), i = 42;

但是在这些情况下确实不允许完全省略分号,因此如果将其中任何一个作为声明的示例而不使用后跟的分号,将有些令人惊讶。实际上,以下内容是非法的:

void *p, f() {}

除了(仅)函数声明外,函数定义不能与其他任何声明或定义组合到同一 type-specifier 。 (如果这是合法的,它将同时定义void *pvoid f() {}。)

无论如何,这似乎是“陷阱”类型的问题,不应在中间编程测试中使用。

(哦,顺便说一句,请实际上不要编写类似int f(), i = 42;的代码。)

答案 2 :(得分:82)

其他答案和评论指出了这是一个可怕,误导且写得不好的问题的多种方式中的几种。但是还有另一个人尚未发现的问题。问题是:

  

在函数声明后不需要分号(';')。对还是错。

好的,让我们看一下函数声明:

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#,因为他们触手可及的地方是类型声明以无意义的分号结尾。设计团队不想因为这种习惯而惩罚他们。 :-)

答案 3 :(得分:25)

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

int func(){
    return 1;
}

该陈述非常含糊。正确的答案应该是:这取决于您声明函数的方式。

无论如何,我也会选择false,也许您可​​以向某人报告问题。

答案 4 :(得分:20)

  

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

     

对还是错。

。任何声明后都不需要使用分号。也没有任何定义。也没有任何声明。

许多声明必须以分号结尾,如第7节[dcl.dcl]中指定的语法所示。但是之后再也不需要写第二篇了。

答案 5 :(得分:6)

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

声明是这样的:

int add(int, int);

一个定义是这样的:

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

答案 6 :(得分:6)

很遗憾,您所提出的问题没有说“紧随其后”。例如,我们可以这样写:

foreach (string item in Class1.list)
{
 MessageBox.Show(Class1.list.ToString());
 row.Cells[0].Value = item;
}      

或者我可以写:

int func()  /* My function */ ;

在第一种情况下,分号不是直接在声明之后,但是可以。

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

我认为Eric Lippert在his answer中有正确的想法。

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

答案 7 :(得分:6)

尽管我几乎同意所有其他答案,但指出该问题的措词非常含糊,而且您的答案在技术上是正确的,但请允许我给出不同的看法:

这就是我一直称呼他们的方式:

void func();  // The function prototype

...

void func()
{
    // The function definition
}

我假设问题是由这个术语引起的。

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

但是,当然,函数原型(在顶部)与函数的实际定义之间存在很大差异。

答案 8 :(得分:4)

您只能将;用于原型。

答案 9 :(得分:4)

这是一个棘手的问题,但是他们使用了 declaration 这个词,意思是这样的:

int example();

所以在这种情况下是真的。

如果他们使用了 implementation 这个词,那将是错误的。

答案 10 :(得分:2)

使用分号(;)告诉编译器,在此分号(;)之后,新的语句开始。

因此,我认为仅在函数声明期间才需要使用分号(;)。因此,根据我的说法,答案将是正确的。

答案 11 :(得分:2)

如果在main()之前定义了功能

  • 不需要分号,因为该函数已定义

在main()之后定义了功能时:

  • 需要分号,因为您正在对该函数进行原型设计并告诉编译器该函数已退出。