最近我参加了一场中级编程测试,其中有一个问题我做错了:
在函数声明后不需要分号 (';')。
是真的还是假的。
我选择了“假”(如果我错了,请纠正我,因为我感觉自己要疯了),函数声明是你在定义之前写的东西(在代码顶部),所以当调用它之前编译器就知道函数的名字,而函数定义则构成了整个函数。
例如:
声明:
int func();
定义:
int func() {
return 1;
}
这个答案不应该是错误的吗?
最近我参加了一场中级编程测试,其中有一个问题我做错了:
在函数声明后不需要分号 (';')。
是真的还是假的。
我选择了“假”(如果我错了,请纠正我,因为我感觉自己要疯了),函数声明是你在定义之前写的东西(在代码顶部),所以当调用它之前编译器就知道函数的名字,而函数定义则构成了整个函数。
例如:
声明:
int func();
定义:
int func() {
return 1;
}
这个答案不应该是错误的吗?
你可以在一个步骤中声明并定义函数,也就是说,如果你在声明函数的地方包含函数定义。所以从技术上讲,我想 "true" 是正确的。但问题的措辞让我回答了你的方式。
除了 "定义也是声明" 这一点之外,以下内容在合法的 C++ 中也是成立的:
int f(), g();
这里声明了两个函数f
和g
,它们都没有参数并且返回类型为int
,但是f
的定义后面没有紧跟一个分号。同样地,这也是合法的:
int f(), i = 42;
但在这些情况下完全省略分号是不允许的,因此如果将它们作为没有跟随分号的声明的例子,那么这将是令人惊讶的。实际上,以下写法是不合法的:
void *p, f() {}
除了函数声明外,函数定义不能与任何其他相同的类型说明符声明或定义结合在一起。(如果这是合法的,它将同时定义void *p和void f() {}。)总之,这似乎是一个“坑人的”问题,不应该出现在中级编程测试中。(顺便说一句,请不要真的写像int f(), i = 42;这样的代码。)typedef int fooProc(int); fooProc a,b.c.d.e;
我不确定为什么早期基于软盘驱动器的编译器标准头文件没有这样做,因为我认为它会使头文件更小,从而处理速度更快。 - supercatint f(int(&g)(),int(*h)()){return g()+h();}
这个代码。它有三个函数声明,其中一个后面跟着一个左花括号,另一个后面跟着一个逗号,第三个后面跟着一个右括号。 - David Hammenint f(stuff)
之外的函数。即使在函数范围内,g
是一个类型为函数引用的自动变量,而h
是一个函数指针。 - Peter Cordesint 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)
{
// ...
}
int func() /* My function */ ;
或者我可以写:
int func()
int a = 42;
void func(); // The function prototype
...
void func()
{
// The function definition
}
我假设问题是以这个术语为背景的。
在我看来,“定义”和“声明”是相同的概念。"我定义 x = y" == "我声明 x = y"。
但当然,在函数原型(顶部)和函数的实际定义之间有很大的区别。
void func();
与void func(void);
完全等价。这与C非常不同,其中void func();
对编译器不提供有关参数的任何信息,并且与void func(void);
不同。稍后的原型或定义是一个好主意,否则调用者必须应用默认参数提升(例如float->double和窄整数类型到int。与可变参数函数的参数相同规则)。 - Peter Cordes;
。这是一个有些棘手的问题,但他们使用了单词declaration,其意思类似于:
int example();
所以在这种情况下是正确的。
如果他们使用了“实现”这个词,则会是错误的。