0

このコードが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が実行されるかどうかです。そうでない場合は、なぜエラーや警告が表示されないのですか。

4

4 に答える 4

10

xは実際にはargcであるため(そして引数の数は1です)

mainの署名は次のとおりです。

int main (int argc, char **argv)

argcは引数の数で
あり、argvはそれらの引数の配列です。

于 2013-02-26T16:57:49.927 に答える
1

アップデート

C ++ドラフト標準セクションの主な機能の段落2を見ると、あなたのmain宣言は無効です(強調鉱山):3.6.1

実装は、主な機能を事前に定義してはなりません。この関数はオーバーロードされてはなりません。戻り型はint型でなければなりませんが、それ以外の場合、その型は実装定義です。すべての実装で両方が許可されます

—()がintとを返す関数

— intを返す(int、charへのポインタへのポインタ)の関数

したがって、コンパイラのドキュメントで定義されているこれらの標準フォームまたは実装定義mainフォームのいずれかに準拠する必要があります。

gcc警告レベルに関係なく、これに対する警告が表示されます。clangこれはエラーであるため、エラーが表示されない理由がわかりません。

元の回答

mainの最初の引数は、通常argcとして示される引数の数です。例:

int main(int argc, char *argv[])
{
}

argvは、プログラムへの引数を表す文字列の配列であり、最初の引数はコマンドラインです。

于 2013-02-26T16:58:01.307 に答える
1

では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また、プログラム内から呼び出してトリッキーになろうとしないでください。これは許可されていません。

于 2013-02-26T18:14:40.450 に答える
-1

オペレーティングシステムは次のこの署名を期待しているためmain

int main(int argc, char** argv);

argcパラメータの量です。を呼び出すと、最初のパラメーターとしてmain引数の量()が渡さargcれます。これは1です(引数なしでバイナリを呼び出す場合でも$0、bashのバイナリファイル名という1つの引数を取得します)。

これはCABIにも依存することに注意してください。C / C ++標準では、の複数の署名mainが許可されています。したがって、コンパイラとOSに応じて、の処理が異なる可能性がありますmain。あなたがしていることは、実際には定義された振る舞いではありません。

期待どおりに宣言する必要がmainあります。これは、OSが期待して使用するものだからです。プログラムしたいもののために別の関数を作成します。

于 2013-02-26T16:59:11.277 に答える