c - 圧縮 - 自然 冷媒 冷凍 機




Cコード:これらはどのように機能しますか? (3)

私はhereこれを見here

#include <stdio.h>

int main(int argc, char *argv[printf("Hello, world!\n")]) {}

これは、 "Hello World!"という印字です。

しかし、実際にここで何が起こっているのですか?

私が推測できるベストは、それがコンパイルされ、実行スタックの一番上にスローされるということですが、構文は私に合法的に見えません...


char *argv[printf("Hello, world!\n")])

printf()は、印刷される文字数を返します。

そう

int main(int argc, char *argv[printf("Hello, world!\n")]) {}

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

printf()を呼び出して"Hello World"を出力します"Hello World"


このコードでは、C99の可変長配列機能を使用しています。これにより、実行時にのみサイズがわかる配列を宣言できます。 printfは、実際に印刷された文字数に等しい整数を返します。そのため、コードは "Hello、world!"という文字を出力します。 最初にargvのサイズとして戻り値を使用します。 main機能自体は何もしません。 printfへの実際の呼び出しはおそらく、コンパイラによって生成されたスタートアップコードに入ります。

編集: gccで生成されたコードの逆アセンブリを確認したところ、 printfの呼び出しは他のコードの前にmain本体の内部に入ります。


私はCの専門家ではありませんが、コマンドライン引数がmainと同時に宣言されているようです。





puzzle