このコードが5ではなく1を出力する理由
コード:
main(int x=5) //this defn. is written intentionally to chec weather main accepts
expression or not.
{
printf("%d",x);
}
使用したコンパイラ:minGW3.2
編集
私のポイントは、天気x=5が実行されるかどうかです。そうでない場合は、なぜエラーや警告が表示されないのですか。
xは実際にはargcであるため(そして引数の数は1です)
mainの署名は次のとおりです。
int main (int argc, char **argv)
argcは引数の数で
あり、argvはそれらの引数の配列です。
アップデート
C ++ドラフト標準セクションの主な機能の段落2を見ると、あなたのmain宣言は無効です(強調鉱山):3.6.1
実装は、主な機能を事前に定義してはなりません。この関数はオーバーロードされてはなりません。戻り型はint型でなければなりませんが、それ以外の場合、その型は実装定義です。すべての実装で両方が許可されます
—()がintとを返す関数
— intを返す(int、charへのポインタへのポインタ)の関数
したがって、コンパイラのドキュメントで定義されているこれらの標準フォームまたは実装定義mainフォームのいずれかに準拠する必要があります。
gcc警告レベルに関係なく、これに対する警告が表示されます。clangこれはエラーであるため、エラーが表示されない理由がわかりません。
元の回答
mainの最初の引数は、通常argcとして示される引数の数です。例:
int main(int argc, char *argv[])
{
}
argvは、プログラムへの引数を表す文字列の配列であり、最初の引数はコマンドラインです。
ではvoid f(int x = 5)、= 5パーツはデフォルトの引数です。関数は2つの異なる方法で呼び出すことができます。
f(); // uses default argument, as if f(5)
f(3); // explicit argument
デフォルトの引数を使用するかどうかの決定は、宣言の時点ではなく、呼び出しの時点で行われることに注意してください。有効かどうかに関係なくint main(int x = 5, char *argv[])、アプリケーションの起動コード(コンパイラのライブラリの一部)は、試行されたデフォルト引数を認識しないため、何もしません。mainまた、プログラム内から呼び出してトリッキーになろうとしないでください。これは許可されていません。
オペレーティングシステムは次のこの署名を期待しているためmain:
int main(int argc, char** argv);
argcパラメータの量です。を呼び出すと、最初のパラメーターとしてmain引数の量()が渡さargcれます。これは1です(引数なしでバイナリを呼び出す場合でも$0、bashのバイナリファイル名という1つの引数を取得します)。
これはCABIにも依存することに注意してください。C / C ++標準では、の複数の署名mainが許可されています。したがって、コンパイラとOSに応じて、の処理が異なる可能性がありますmain。あなたがしていることは、実際には定義された振る舞いではありません。
期待どおりに宣言する必要がmainあります。これは、OSが期待して使用するものだからです。プログラムしたいもののために別の関数を作成します。