在C++中的函数声明之后是不是需要分号(';')?

Log*_*gan 174 c++ syntax declaration function

我刚刚进行了中间编程测试,其中一个问题我的错误如下:

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

对或错.

我选择了"假"(请纠正我,如果我错了因为我觉得我疯了),函数声明就是你在定义之前写的(在代码的顶部)所以编译器知道函数甚至在调用之前调用,函数定义是整个函数的组成部分.

即.

宣言:

int func();
Run Code Online (Sandbox Code Playgroud)

定义:

int func() {
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,这个答案不应该是假的吗?

jwi*_*mar 162

您可以在一个步骤中声明和定义函数,即如果在声明它的位置包含函数定义.从技术上讲,我认为这是正确的.但问题的措辞是这样的,我会像你那样回答它.

  • @IFunball好参数.愚蠢的自然语言.在函数声明之后不需要句子"分号(';')"可以读作"分号(';')不是**(永远)**函数声明后需要"或"分号" (';')在函数声明后不需要**(总是)**.是否将陈述限定为真或假取决于选择解释.严格说来这个问题不清楚,因此没有明确的答案. (16认同)
  • 我认为,由于你给出的理由,这是不正确的.如果有需要分号的情况,那么它是假的(或不是真的).对我来说,真实是绝对的,如果有明确的情况需要,那么你就不能说真的. (10认同)
  • @IFunball这是因为"声明"没有进一步的背景,也没有声明我们是语言律师,通常被理解为"非定义声明".这个问题不公平. (6认同)
  • 任何知道正在测试的内容的人都不清楚任何考试问题. (2认同)
  • 听起来我们需要在英语中添加一个未定义的行为子句 (2认同)

Arn*_*gel 148

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

int f(), g();
Run Code Online (Sandbox Code Playgroud)

这声明了两个函数,f并且g都没有参数且返回类型为int,但是f分号后面没有(立即)定义.同样,这是合法的:

int f(), i = 42;
Run Code Online (Sandbox Code Playgroud)

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

void *p, f() {}
Run Code Online (Sandbox Code Playgroud)

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

在任何情况下,这似乎都是一个"陷阱"类型的问题,不应该在中间编程测试中.

(哦,顺便说一下,请不要写代码int f(), i = 42;.)

  • 也可以使用typedef来定义函数类型,然后使用它来一次声明许多函数,例如`typedef int fooProc(int); fooProc a,bcde;`我不确定为什么基于软盘驱动器的编译器的标准头文件在当天没有这样做,因为我认为它会允许头文件更小,因此更快处理. (2认同)

Eri*_*ert 83

其他答案和评论中提到了许多方法中的几个,这是一个可怕,误导和写得不好的问题.但还有另一个问题,其他人尚未发现.问题是:

函数声明后不需要分号(';').对或错.

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

int func();       /* */
/*           ^       */
/*           |       */
/* That whitespace is "after the function declaration". */
Run Code Online (Sandbox Code Playgroud)

整个事情就是宣言.声明不是int func(),然后 a ;.声明int func();然后是空格.

所以,问题是:声明后需要一个分号吗?当然不是.声明中已经有一个分号,它终止了它. 宣言后的分号毫无意义.相比之下,在函数声明之后int func(); ;将是分号.

问题几乎肯定要问"真或假:函数声明中的最后一个标记始终是分号"但这不是他们写的问题,因为测验的作者没有清楚地思考问题.

我的建议是完全避免编程语言测验.他们非常可怕.


有趣的事实,虽然我们在这个问题上.在C#中,这些都是合法的:

class C {}
class D {};
struct E {}
struct F {};
Run Code Online (Sandbox Code Playgroud)

在C#中,类或结构声明可以由分号结束,由您自行决定.这个奇怪的小功能被添加为C/C++程序员来到C#的好处,他们在指尖中使用类型声明以无意义的分号结束; 设计团队不想因为养成这种习惯而惩罚他们.:-)


Luc*_*ini 25

您也可以声明这样的函数:

int func(){
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

声明很模糊.正确的答案应该是:它取决于你如何声明函数.

无论如何,我也选择了假,也许你可以向某人报告问题.

  • 绝对.老实说,我从错误的问题中学到了更多关于函数声明定义的知识,而不是我得到的错误. (11认同)
  • 无论如何,不​​要把事情放在个人层面.重要的是你了解函数声明定义是如何工作的,所以不要太担心它,只要确保问题至少被检查并继续 (3认同)
  • ...编写通用语法(例如函数)将成为您的第二天性.而当你因为刚刚切换语言而搞砸了,那么...... intellisense和语法高亮可以提供快速有效的解决方案.把你的时间和精力投入到更有用的东西上. (2认同)

Mar*_*wen 20

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

对或错.

没错.任何声明后都不需要分号.也没有任何定义.也没有发表任何声明.

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


小智 6

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

声明是这样的:

int add(int, int);
Run Code Online (Sandbox Code Playgroud)

定义是这样的:

int add(int a, int b)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的问题在于,它表明定义和声明是互斥的。实际上,每个定义都是声明。定义是声明的子集。 (10认同)

Nic*_*mon 6

遗憾的是您提出的问题没有直接在“之后”说。例如,我们可以这样写:

int func()  /* My function */ ;
Run Code Online (Sandbox Code Playgroud)

或者我可以写:

int func()
int a = 42;
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,分号不是紧跟在声明之后,而是可以的。

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

我认为埃里克·利珀特(Eric Lippert)的回答是正确的。

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

  • 真好 以额外的句号结束该句子。我知道你在那里做了什么。 (3认同)
  • `int func()int a = 42;`不编译。您需要一个逗号,而不是另一个`int`。请参阅在此之前一天发布的@Arne答案。此答案中唯一的新事物是最后一段,类似于英语句子。 (2认同)

小智 6

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

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

void func();  // The function prototype

...

void func()
{
    // The function definition
}
Run Code Online (Sandbox Code Playgroud)

我以为这个问题是考虑到这个术语的。

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

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