关于功能的这些答案中哪一个是不正确的?


17

因此,当我进行长时间的编译时,我决定对ODesk进行C ++通用测试,并遇到了这个问题。

这个问题

如果我没记错的话,考虑到措辞(或缺乏措辞),所有这些都是正确的。

一种。

int Foo() { }
int Foo(int bar) { }

b。 嗯,return void;在语义上会不正确,但是函数显然可以具有void返回类型。

void Foo() { }

C。这是内联函数的定义,是的。

d。 在不详细说明以下元素的位置的情况下,

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

此外,您始终可以使用lambda和functors进行此操作。

e。

void Foo(int& bar)
{
    ++bar;
}

int foobar = 5;
Foo(foobar);

F。

int bar = 5;

int& GetBar()
{
    return bar;
}

GetBar() = 6;

G。

int bar = 5;

int* GetBar()
{
    return &bar;
}

(*GetBar()) = 5;

我看不到这个问题在哪里有真正错误的答案。我想念什么吗?

不用说我时间不够用,整个事情都失败了。我想我是一个糟糕的C ++程序员。:(


18
来到这里大叫一些粘贴作业的孩子,感到惊喜。
SomeKittens 2014年

实际上,并非所有语言都要求扩展内联函数。“内联”是编译器提示,而不是Delphi中的命令,并且C,C ++ 都有异常。因此“ c”也可能为假。写一个答案说明每个语句可能是错误的可能会更有趣。
莫兹

1
@Ӎσᶎ如果只有一个文本框。我想返回并点击“报告此问题的问题”。
Qix

5
那不是功能数组。那是一个函数指针数组。
user253751 2014年

@immibis是的,但是这个问题并没有真正弄清楚(至少对我来说没有)。
Qix

Answers:


21

这整个问题都是狡猾的。问题陈述意味着可能有多个选择,而单选按钮则表示一个选择。

此外,b非常值得怀疑,因为void函数不会返回任何内容。

D也是有问题的,就我所知,您不能拥有一系列函数。当然,您可以具有一个函数指针数组,但这并不是一回事。


对; D就像询问您是否可以致电int。当然,如果将其
强制

1
我愿意打赌D是他们想要的答案,但是是的,问题很严重。
2014年

尽管void函数不返回任何,但它们仍返回类型 void。因此我说B是真的。
Thomas Eding

@ThomasEding这对他们而言仍然是非常糟糕的措辞。你不是return void;,而是return;
Qix

10

答案c)也可以说是错误的。

“在编译期间扩展了内联函数,以避免调用开销。”

首先,允许C ++编译器inline通过根本不扩展功能来忽略提示。

其次,所陈述的进行扩展的“理由”过于简单。实际上,进行扩展(或不进行扩展)的真正原因完全在编译器编写者的手中。


您是正确的,但我从“好吧,编译器确定它确实要内联函数”而不是inline提示的角度考虑它。
Qix

好了,编译器无法完全忽略提示。至少它是强制性的效果,是ODR的例外。
Deduplicator

@Deduplicator-是的,可以。 “无论您如何将函数指定为内联函数,都是允许编译器忽略的请求:编译器可能会内联扩展您调用被指定为内联函数的位置的部分,全部或全部。” -来源isocpp.org/wiki/faq/Inline-Functions
Stephen C

@StephenC:可以内联扩展它的请求可以忽略,是的。我只说过ODR的明确例外不能。
Deduplicator 2015年

我知道了。我已经更新了措辞我的回答
斯蒂芬ç

7

C。这是内联函数的定义,是的。

那是不完全正确的。
尽管其名称,关键字inline不能保证将内联函数。您唯一可以确定的是,如果编译器多次看到内联函数的定义,则不会抱怨。

因此,严格来说,选项C是不正确的,但我认为这不是测验作者所期望的答案,因为有一个答案甚至更错误。

d。在不详细介绍以下元素的位置的情况下,

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

此外,您始终可以使用lambda和函子来执行此操作。

在您的示例中,functions指向函数的指针数组,而不是函数本身的数组。同样,lambda和函子也不是真正的功能。它们是对函数调用运算符作出响应的类,但是在C ++语言定义的眼中,它们不能使它们起作用。

C ++中的函数有点像二等公民。您可以定义并调用它们,但是一旦尝试使用函数类型执行其他操作(例如创建它们的数组),您可能会遇到错误,或者它们会静默地将自身转换为指针。


我同意D位,但我读的c是与inline关键字本身相比已被肯定标记为内联的函数。我了解inline是一个提示。
2014年

4

如果有的话,那一定是b。你不能return一个void,但你可以返回null。函数声明上的空隙应该在那里,以通知编译器缺少返回值。

虚空类型

在C和C ++中

结果类型为空的函数可以通过到达函数结尾或通过执行没有返回值的return语句来结束。void类型也可能作为函数原型的唯一参数出现,以指示该函数不接受任何参数。请注意,尽管有名称,但在所有这些情况下,void类型都用作单位类型,而不是零或底部类型,即使与单身的实际单位类型不同,void类型也被称为包含空值一组值,并且该语言不提供任何方法来声明对象或表示类型为void的值。


2
-1:虽然void函数不返回任何,但它们仍返回type void。因此我说B是真的。
Thomas Eding

在某些情况下允许返回void。看这里
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.