4

C++ プログラミングに関する試験問題を書きました。私と教授が同意しなかった質問が 1 つあります。問題は、次の機能が機能するかどうかでした。

#include <iostream>
using namespace std;

void f(int=4, long=10, double=3.14);

int main( int argc , char ** argv )
{
    f( , ,8);
      return EXIT_SUCCESS;
}

void f(int i, long l, double d) {
    cout << i << " " << " " << l << " " << d;
}

私はうまくいかないと言いましたが、私の教授は、関数宣言のデフォルトのパラメーターのために、絶対にうまくいくと言いました。MSVC で試してみましたが、うまくいきませんでした。それはコンパイラ固有ですか?どのコンパイラでも動作しないことを教授に納得させ、試験で点数を上げるにはどうすればよいでしょうか?

4

4 に答える 4

6

まず、あなたは正しいです、教授は間違っています。そして、これが機能するはずだと彼が主張しているという事実 (機能しないことを示すのは簡単ですが) は、おそらく C++ を教えるべきではないことを意味します。しかし、どうやって彼に見せるのですか?

少なくとも 2 つの異なるコンパイラでコンパイルしてみてください。両方ともコンパイルに失敗した場合は、有効なコードではない可能性が非常に高くなります。それが最速の方法です。

それが失敗した場合は、C++ 標準を引用してください。[expr.post]p1 で説明されており、非終端参照に従っている呼び出し式の構文は次のとおりです。

postfix-expression:
    ...
    postfix-expression ( expression-list[opt] )

expression-list:
    initializer-list

initializer-list: ([dcl.init]p1)
    initializer-clause ...[opt]
    initializer-list , initializer-clause ...[opt]

initializer-clause:
    assignment-expression
    braced-init-list

braced-init-list:
    { initializer-list ,[opt] }
    { }

代入式をリストするつもりはありませんが、式がゼロになることはあり得ないことに注意してください。少なくとも 1 つのトークンが必要です。つまり、initializer-clause が何もないことはあり得ないため、関数の引数のコンマの間には常に何かが必要です。

于 2013-05-22T18:21:34.110 に答える
4

標準から(強調鉱山、特に単語末尾に注意してください):

8.3.6 デフォルト引数 [dcl.fct.default]

  1. parameter-declaration で initializer-clause が指定されている場合、この initializer-clause はデフォルトの引数として使用されます。デフォルトの引数は、末尾の引数が欠落している呼び出しで使用されます。

  2. 【例:宣言】

void point(int = 3, int = 4);

int 型の 0 個、1 個、または 2 個の引数で呼び出すことができる関数を宣言します。次のいずれかの方法で呼び出すことができます。

point(1,2); point(1); point();

point(1,4)最後の 2 つの呼び出しは、それぞれおよび と同等point(3,4)です。

— 終了例 ]

ポイント還元をお楽しみください。;)

于 2013-05-22T18:18:55.820 に答える
1

msdnで述べたように、省略された末尾のパラメーターに対してのみ機能するためです。次のように関数を呼び出してみてください。

f(); // should use all default values for arguments
f(3); // should use 3 for the first, default for the last two 
f(2, 5); // uses 2 for first, 5 for second, default for last
f(5, 6, 3.4); // does not use any default values
于 2013-05-22T18:18:19.407 に答える
1

それは有効な C++構文でさえありません。

于 2013-05-22T18:16:33.403 に答える