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
您可以在一个步骤中声明和定义函数,即如果在声明它的位置包含函数定义.从技术上讲,我认为这是正确的.但问题的措辞是这样的,我会像你那样回答它.
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;.)
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)
声明很模糊.正确的答案应该是:它取决于你如何声明函数.
无论如何,我也选择了假,也许你可以向某人报告问题.
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)
遗憾的是您提出的问题没有直接在“之后”说。例如,我们可以这样写:
int func() /* My function */ ;
Run Code Online (Sandbox Code Playgroud)
或者我可以写:
int func()
int a = 42;
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,分号不是紧跟在声明之后,而是可以的。
在第二种情况下,在声明之后有一个分号,但不是在声明之后。
我认为埃里克·利珀特(Eric Lippert)的回答是正确的。
这就像说“英语句子结束后应该有句点吗?”。可以说,一个句子的末尾已经有句号(否则它就不会是一个句子),因此句子后不应有句号。
小智 6
尽管我几乎同意所有其他答案,但都指出该问题的措词非常含糊,并且您的答案在技术上是正确的,但请允许我给出不同的看法:
这就是我一直称呼他们的方式:
void func(); // The function prototype
...
void func()
{
// The function definition
}
Run Code Online (Sandbox Code Playgroud)
我以为这个问题是考虑到这个术语的。
在我看来,定义和声明都是同一个概念。“我定义x = y” ==“我声明x = y”。
但是,当然,函数原型(在顶部)与函数的实际定义之间存在很大差异。