機能に関するこれらの答えのどれが間違っていますか?


17

そのため、私はいくつかの長いコンパイルを行っている間に、ODeskでC ++の一般的なテストを受けることに決め、この質問に出会いました。

この質問

言葉遣い(またはその欠如)を考えると、私が間違っていなければ、これらすべてが真実である可能性があります。

a。

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;

さらに、ラムダとファンクターを使用していつでもこれを行うことができます。

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 14

実際、すべての言語でインライン関数を拡張する必要があるわけではありません。「インライン」はDelphiのコマンドではなくコンパイラヒントであり、C、C ++には例外があります。したがって、「c」もfalseになる可能性があります。各ステートメントがどのように間違っている可能性があるかを示す答えを書く方が、より楽しいかもしれません。
モー14

1
@Ӎσᶎテキストボックスがある場合のみ。戻って「この質問の問題を報告する」をクリックします。
Qix 14

5
それは関数の配列ではありません。それは関数ポインタの配列です。
user253751 14

@immibis本当ですが、質問は本当に明確ではありません(少なくとも私にとってはそうではありませんでした)。
Qix 14

回答:


21

この質問全体は危険です。質問文は複数の選択肢の可能性を暗示していますが、ラジオボタンは単一の選択肢を示しています。

さらに、void関数は何も返さないため、bはかなり疑わしいです。

Dも疑問です。私が知る限り、関数の配列を持つことはできません。もちろん、関数ポインターの配列を使用できますが、それはまったく同じものではありません。


正しい; Dは、を呼び出すことができるかどうかを尋ねるようなものですint。確かに、あなたはポインタとそのポインタにキャストした場合の機能を指し...
クイックス

1
私はDが彼らが目指す答えであることに賭けたいと思っていますが、はい、質問は貧弱です。
ロボットを

一方でvoid関数がどの返さない価値を、彼らはまだ返すタイプを void。したがって、私はBが本当だと言います。
トーマスエディング14

@ThomasEdingそれは彼らの側でまだ本当に悪い言葉遣いです。しませんreturn void;が、代わりにreturn;
Qix

10

回答c)もほぼ間違いです。

「呼び出し時にオーバーヘッドを回避するために、コンパイル時にインライン関数が拡張されます。」

まず、C ++コンパイラはinline、関数をまったく展開しないことでヒントを無視できます。

第二に、拡大を行うために述べられた「理由」は単純化しすぎです。実際、拡張を行う(または行わない)本当の理由は、コンパイラライターの手に完全にかかっています。


あなたがしている正しいが、私はの意味でそれについて考えていた「大丈夫、コンパイラが決定していない機能インライン化したい」というよりもinlineヒントを。
Qix 14

さて、コンパイラはヒントを完全に無視することはできません。少なくともそれは必須の効果であり、ODRを例外にします。
デデュプリケーター

@Deduplicator-はい、できます。 「関数をインラインとして指定する方法に関係なく、コンパイラーは無視することが許可されています。コンパイラーは、インラインとして指定された関数を呼び出す場所の一部、すべて、またはまったくインライン展開しない場合があります。」-ソースisocpp.org/wiki/faq/Inline-Functions
Stephen C

@StephenC:インライン展開するリクエストは無視できます、はい。ODRの明示的な例外はできないとだけ言った。
デデュプリケーター

そうですか。私は私の答えの文言を更新しました
スティーブンC

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;

さらに、ラムダとファンクターを使用して、常にこれを行うことができます。

あなたの例でfunctionsは、は関数ポインタの配列であり、関数自体の配列ではありません。同様に、ラムダとファンクタも実際には機能しません。これらは、関数呼び出し演算子に応答するクラスですが、C ++言語定義の観点からは関数になりません。

C ++の関数は、二流の市民に少し似ています。それらを定義して呼び出すことはできますが、関数型で何か他のことを行おうとすると(それらの配列を作成するなど)、エラーが発生するか、暗黙的にポインターに変換されます。


Dビットには同意しますがcinlineキーワード自体とは対照的に、インライン化のために既に明確にマークされている関数として読んでいました。私は理解inlineヒントです。
Qix 14年

4

どちらかといえば、bでなければなりません。することはできませんreturnvoid、返すことができますnull。関数宣言の無効は、コンパイラーに戻り値の不足を通知するためにあるべきです。

ボイドタイプ

CおよびC ++で

結果タイプがvoidの関数は、関数の最後に到達するか、戻り値のないreturnステートメントを実行することにより終了します。void型は、関数が引数を取らないことを示すために、関数プロトタイプの唯一の引数として表示される場合もあります。名前にもかかわらず、これらのすべての状況で、空のタイプはゼロまたはボトムタイプとしてではなく、ユニットタイプとして機能し、シングルトンである実際のユニットタイプとは異なり、空のタイプは空を含むと言われていることに注意してください値のセット。言語は、オブジェクトを宣言したり、void型の値を表す方法を提供しません。


2
-1:void関数は値を返しませんが、タイプを 返しvoidます。したがって、私はBが本当だと言います。
トーマスエディング14

状況によっては、voidを返すことが許可されています。こちらをご覧ください
ジョシュケリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.