我最近刚刚参加了一次中间编程测试,我弄错了一个问题,如下所示:
在函数声明后不需要分号(';')。
对还是错。
我选择了“ false”(如果我错了,请纠正我,因为我觉得自己快疯了),在定义之前您要编写一个函数 declaration (在顶部)代码)),因此编译器甚至在调用函数之前就已经知道了函数调用,而函数定义是组成函数整体的。
即
声明:
int func();
定义:
int func() {
return 1;
}
答案不对吗?
答案 0 :(得分:163)
您可能会遇到一步声明和定义函数的情况,即是否在声明函数的位置包括了函数定义。所以从技术上来说我认为true是正确的。但是问题的措词使我会像您一样回答。
答案 1 :(得分:148)
除了“定义也是声明”之外,以下是合法的C ++:
int f(), g();
这声明了两个函数f
和g
,它们都没有参数,返回类型为int
,但是没有立即遵循f
的定义用分号。同样,这是合法的:
int f(), i = 42;
但是在这些情况下确实不允许完全省略分号,因此如果将其中任何一个作为声明的示例而不使用后跟的分号,将有些令人惊讶。实际上,以下内容是非法的:
void *p, f() {}
除了(仅)函数声明外,函数定义不能与其他任何声明或定义组合到同一 type-specifier 。 (如果这是合法的,它将同时定义void *p
和void 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()之后定义了功能时: