C++ 函数声明后不需要分号(';')吗?
Isn't a semicolon (';') needed after a function declaration in C++?
最近刚考了中级编程,其中一道题错了如下:
A semicolon (';') is not needed after a function declaration.
True or False.
我选择了"false"(如果我错了请纠正我因为我觉得我快疯了),一个函数declaration就是你写的在定义之前(在代码的顶部)所以编译器在调用它之前就知道函数调用,函数 definition 是构成整个函数的东西。
即
声明:
int func();
定义:
int func() {
return 1;
}
这个问题的答案不应该是假的吗?
您可能会遇到这样一种情况,即在一个步骤中声明和定义函数,即如果您在声明它的地方包含函数定义。所以 技术上 我认为 true 是正确的。但是这个问题的措辞方式让我会像你那样回答它。
你也可以像这样声明一个函数:
int func(){
return 1;
}
这个说法很含糊。正确答案应该是:这取决于你如何声明函数。
反正我也选false,也许你可以把问题反馈给别人。
除了"a definition is also a declaration"之外,以下是合法的C++:
int f(), g();
这声明了两个函数,f
和 g
,它们都没有参数并且 return 类型为 int
,但是 f
的定义没有(立即)跟一个分号。同样,这是合法的:
int f(), i = 42;
但在这些情况下确实不允许完全省略分号,因此如果将其中任何一个作为声明的示例而后面没有分号,则有点令人惊讶。事实上,以下是非法的:
void *p, f() {}
除了(纯粹的)函数声明,函数 定义 不能与任何其他声明或定义组合到相同的 type-specifier. (如果这是合法的,它将同时定义 void *p
和 void f() {}
。)
无论如何,这似乎是一个 "gotcha" 类型的问题,不应该出现在中级编程测试中。
(哦,对了,请不要真的写int f(), i = 42;
这样的代码。)
其他答案和评论以多种方式指出这是一个可怕的、误导性的和写得不好的问题。但是还有另一个问题,其他人还没有发现。问题是:
A semicolon (';') is not needed after a function declaration. True or False.
OK,我们来看一个函数声明:
int func(); /* */
/* ^ */
/* | */
/* That whitespace is "after the function declaration". */
整个就是声明。声明不是int func()
然后接着一个;
。声明是 int func();
,然后是空格。
所以,问题是:在声明之后是否需要分号?当然不是。 声明中已有分号终止它。声明后的分号将毫无意义。相比之下,int func(); ;
将是函数声明后的分号 。
这个问题几乎可以肯定打算问这个问题"true or false: the last token in a function declaration is always a semicolon"但是那不是他们写的问题,因为测验的作者没有想清楚问题。
我的建议是完全避免编程语言测验。他们很糟糕。
有趣的事实,而我们正在讨论这个问题。在 C# 中,这些都是合法的:
class C {}
class D {};
struct E {}
struct F {};
在 C# 中,class 或结构声明可以以分号结尾,也可以不以分号结尾,由您自行决定。添加这个奇怪的小功能是为了 C/C++ 来到 C# 的程序员的好处,他们对类型声明以无意义的分号结尾感到触手可及;设计团队不想因为他们有这种习惯而惩罚他们。 :-)
这取决于我们是声明函数还是定义函数。
如果我们声明函数,我们需要包含分号(;
),如果我们定义函数,则不需要分号。
一个声明是这样的:
int add(int, int);
定义是这样的:
int add(int a, int b)
{
// ...
}
可惜你做的题没有说"directly after"。例如,我们可以这样写:
int func() /* My function */ ;
或者我可以这样写:
int func()
int a = 42;
在第一种情况下,分号不是紧跟在声明之后,但这样也可以。
在第二种情况下有一个分号 "after" 声明,但不是紧跟在声明之后。
我认为 Eric Lippert 在 中的想法是正确的。
这就像在说 "should there be a period after the end of a sentence in English?"。可以说,一个句子的末尾已经有一个句号(否则它就不是一个句子)因此不应该有句号 after 句子..
尽管我同意几乎所有其他答案,并指出问题措辞非常模棱两可,并且您的答案在技术上是正确的,但请允许我给出不同的观点:
我一直这样称呼他们:
void func(); // The function prototype
...
void func()
{
// The function definition
}
我假设问题是根据这个术语提出的。
定义和声明在我看来是同一个概念。 "I define x = y" == "I declare x = y".
当然,函数原型(在顶部)和函数的实际定义之间存在很大差异。
A semicolon (';') is not needed after a function declaration.
True or False.
正确。任何声明后都不需要分号。也没有任何定义。也不在任何声明之后。
如第 7 节 [dcl.dcl] 中指定的语法,许多类型的声明必须以分号结尾。但是之后就再也没有必要再写了。
您只能将 ;
用于原型。
分号(;)是用来告诉编译器在这个分号(;)之后开始一个新的语句。
所以我认为分号 (;) 仅在函数声明期间是必需的。所以在我看来,答案是正确的。
这是一个棘手的问题,但他们使用了 声明 这个词,意思是这样的:
int example();
所以在这种情况下是正确的。
如果他们使用了实施这个词,那么它就是错误的。
当函数 在 main() 之前定义时:
- 不需要分号因为函数已经定义
当函数 在 main() 之后定义时:
- 需要分号 因为您正在制作该函数的原型并告诉编译器该函数已退出。
最近刚考了中级编程,其中一道题错了如下:
A semicolon (';') is not needed after a function declaration.
True or False.
我选择了"false"(如果我错了请纠正我因为我觉得我快疯了),一个函数declaration就是你写的在定义之前(在代码的顶部)所以编译器在调用它之前就知道函数调用,函数 definition 是构成整个函数的东西。
即
声明:
int func();
定义:
int func() {
return 1;
}
这个问题的答案不应该是假的吗?
您可能会遇到这样一种情况,即在一个步骤中声明和定义函数,即如果您在声明它的地方包含函数定义。所以 技术上 我认为 true 是正确的。但是这个问题的措辞方式让我会像你那样回答它。
你也可以像这样声明一个函数:
int func(){
return 1;
}
这个说法很含糊。正确答案应该是:这取决于你如何声明函数。
反正我也选false,也许你可以把问题反馈给别人。
除了"a definition is also a declaration"之外,以下是合法的C++:
int f(), g();
这声明了两个函数,f
和 g
,它们都没有参数并且 return 类型为 int
,但是 f
的定义没有(立即)跟一个分号。同样,这是合法的:
int f(), i = 42;
但在这些情况下确实不允许完全省略分号,因此如果将其中任何一个作为声明的示例而后面没有分号,则有点令人惊讶。事实上,以下是非法的:
void *p, f() {}
除了(纯粹的)函数声明,函数 定义 不能与任何其他声明或定义组合到相同的 type-specifier. (如果这是合法的,它将同时定义 void *p
和 void f() {}
。)
无论如何,这似乎是一个 "gotcha" 类型的问题,不应该出现在中级编程测试中。
(哦,对了,请不要真的写int f(), i = 42;
这样的代码。)
其他答案和评论以多种方式指出这是一个可怕的、误导性的和写得不好的问题。但是还有另一个问题,其他人还没有发现。问题是:
A semicolon (';') is not needed after a function declaration. True or False.
OK,我们来看一个函数声明:
int func(); /* */
/* ^ */
/* | */
/* That whitespace is "after the function declaration". */
整个就是声明。声明不是int func()
然后接着一个;
。声明是 int func();
,然后是空格。
所以,问题是:在声明之后是否需要分号?当然不是。 声明中已有分号终止它。声明后的分号将毫无意义。相比之下,int func(); ;
将是函数声明后的分号 。
这个问题几乎可以肯定打算问这个问题"true or false: the last token in a function declaration is always a semicolon"但是那不是他们写的问题,因为测验的作者没有想清楚问题。
我的建议是完全避免编程语言测验。他们很糟糕。
有趣的事实,而我们正在讨论这个问题。在 C# 中,这些都是合法的:
class C {}
class D {};
struct E {}
struct F {};
在 C# 中,class 或结构声明可以以分号结尾,也可以不以分号结尾,由您自行决定。添加这个奇怪的小功能是为了 C/C++ 来到 C# 的程序员的好处,他们对类型声明以无意义的分号结尾感到触手可及;设计团队不想因为他们有这种习惯而惩罚他们。 :-)
这取决于我们是声明函数还是定义函数。
如果我们声明函数,我们需要包含分号(;
),如果我们定义函数,则不需要分号。
一个声明是这样的:
int add(int, int);
定义是这样的:
int add(int a, int b)
{
// ...
}
可惜你做的题没有说"directly after"。例如,我们可以这样写:
int func() /* My function */ ;
或者我可以这样写:
int func()
int a = 42;
在第一种情况下,分号不是紧跟在声明之后,但这样也可以。
在第二种情况下有一个分号 "after" 声明,但不是紧跟在声明之后。
我认为 Eric Lippert 在
这就像在说 "should there be a period after the end of a sentence in English?"。可以说,一个句子的末尾已经有一个句号(否则它就不是一个句子)因此不应该有句号 after 句子..
尽管我同意几乎所有其他答案,并指出问题措辞非常模棱两可,并且您的答案在技术上是正确的,但请允许我给出不同的观点:
我一直这样称呼他们:
void func(); // The function prototype
...
void func()
{
// The function definition
}
我假设问题是根据这个术语提出的。
定义和声明在我看来是同一个概念。 "I define x = y" == "I declare x = y".
当然,函数原型(在顶部)和函数的实际定义之间存在很大差异。
A semicolon (';') is not needed after a function declaration.
True or False.
正确。任何声明后都不需要分号。也没有任何定义。也不在任何声明之后。
如第 7 节 [dcl.dcl] 中指定的语法,许多类型的声明必须以分号结尾。但是之后就再也没有必要再写了。
您只能将 ;
用于原型。
分号(;)是用来告诉编译器在这个分号(;)之后开始一个新的语句。
所以我认为分号 (;) 仅在函数声明期间是必需的。所以在我看来,答案是正确的。
这是一个棘手的问题,但他们使用了 声明 这个词,意思是这样的:
int example();
所以在这种情况下是正确的。
如果他们使用了实施这个词,那么它就是错误的。
当函数 在 main() 之前定义时:
- 不需要分号因为函数已经定义
当函数 在 main() 之后定义时:
- 需要分号 因为您正在制作该函数的原型并告诉编译器该函数已退出。