我最近刚刚参加了一次中间编程测试,而我弄错的问题之一如下:
函数声明后不需要分号(';')。
对或错。
我选择了“ false”(如果我做错了,请纠正我,因为我觉得自己快疯了),函数声明是您在定义之前(代码顶部)编写的,因此编译器知道该函数在调用它之前就调用它,并且函数定义是整个函数的组成部分。
即
宣言:
int func();
定义:
int func() {
return 1;
}
答案不对吗?
我最近刚刚参加了一次中间编程测试,而我弄错的问题之一如下:
函数声明后不需要分号(';')。
对或错。
我选择了“ false”(如果我做错了,请纠正我,因为我觉得自己快疯了),函数声明是您在定义之前(代码顶部)编写的,因此编译器知道该函数在调用它之前就调用它,并且函数定义是整个函数的组成部分。
即
宣言:
int func();
定义:
int func() {
return 1;
}
答案不对吗?
Answers:
您可能会遇到一种情况,即一步就声明并定义了函数,即,如果在声明函数的位置包括了函数定义。因此,从技术上讲,我认为true是正确的。但是问题的措辞使我会以您的方式回答。
除了“定义也是声明”之外,以下是合法的C ++:
int f(), g();
这声明了两个函数f
和g
,都没有参数,返回类型为int
,但是f
没有立即对分号进行定义。同样,这是合法的:
int f(), i = 42;
但是确实不允许在这些情况下完全省略分号,因此如果将其中任何一个作为声明的示例而没有后面的分号,将有些令人惊讶。实际上,以下内容是非法的:
void *p, f() {}
除了(单纯的)函数声明外,函数定义不能与其他任何声明或定义合并到同一类型说明符中。(如果这是合法的,它将同时定义a void *p
和a void f() {}
。)
无论如何,这似乎是“陷阱”类型的问题,不应在中间编程测试中使用。
(哦,顺便说一句,请实际上不要编写类似的代码int f(), i = 42;
。)
typedef int fooProc(int); fooProc a,b.c.d.e;
我不确定为什么基于软盘驱动器的编译器的标准头文件没有这样做一天,因为我认为这样做可以使头文件变得小很多,因此处理起来更快。
int f(int(&g)(),int(*h)()){return g()+h();}
这有三个函数声明,其中一个后面是一个大括号,另一个是逗号,第三个是右括号。
int f(stuff)
。即使在函数范围内,它也是对函数g
的类型引用的自动变量,并且h
是对函数的指针。
其他答案和评论指出了这是一个可怕,误导且写得不好的问题的多种方式中的几种。但是还有另一个人尚未发现的问题。问题是:
函数声明后不需要分号(';')。对或错。
OK,让我们看一下函数声明:
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 func(){
return 1;
}
该声明非常含糊。正确的答案应该是:这取决于您声明函数的方式。
无论如何,我也会选择false,也许您可以将问题报告给某人。
函数声明后不需要分号(';')。
对或错。
真正。任何声明后都不需要分号。也没有任何定义。也没有任何声明。
如第7节[dcl.dcl]中指定的语法,许多声明必须以分号结尾。但是在那之后再也不需要写第二篇了。
这取决于我们是声明还是定义函数。如果要声明函数,则需要包括分号(;
),如果要定义函数,则不需要分号。
声明是这样的:
int add(int, int);
定义是这样的:
int add(int a, int b)
{
// ...
}
尽管我几乎同意所有其他答案,但指出该词措词非常含糊,并且您的答案在技术上是正确的,但请允许我给出不同的看法:
这就是我一直称呼他们的方式:
void func(); // The function prototype
...
void func()
{
// The function definition
}
我以为这个问题是考虑到这个术语的。
在我看来,定义和声明都是同一个概念。“我定义x = y” ==“我声明x = y”。
但是,当然,函数原型(在顶部)与函数的实际定义之间存在很大差异。
void func();
完全等同于void func(void);
。这是很大的不同Ç,其中void func();
并没有告诉有关ARGS编译任何东西,是不一样的东西void func(void);
。稍后的原型或定义是个好主意,否则调用者必须将默认的arg提升(例如float-> double和窄整数类型应用于int
。与可变参数函数的arg的规则相同。)
很遗憾您提出的问题没有说“紧接着”。例如,我们可以这样写:
int func() /* My function */ ;
或者我可以写:
int func()
int a = 42;
在第一种情况下,分号不是紧跟在声明之后,而是可以的。
在第二种情况下,在声明之后有分号,但不是在声明后。
我认为埃里克·利珀特(Eric Lippert)的回答是正确的。
这就像在说“英语句子结束后应该有句点吗?”。可以说,一个句子的末尾已经有句号(否则就不会是一个句子),因此句子后不应有句号。
int func() int a=42;
无法编译。您需要一个逗号,而不是另一个int
。请参阅前一天发布的@Arne答案。此答案中唯一的新事物是最后一段,类似于英语句子。
这是一个棘手的问题,但是他们使用了“ 声明 ”一词,意思是这样的:
int example();
所以在这种情况下是真的。
如果他们使用了实现一词,那将是错误的。
使用分号(;)告诉编译器,在此分号(;)之后,新语句开始。
因此,我认为仅在函数声明期间才需要使用分号(;)。因此,根据我的说法,答案将是正确的。