- ベストアンサー
"main"について
"main"についての質問です。 今まで私は"main"というのはC言語の予約語の一つだと思い込んでいましたので、"main"は変数名には使えないと思っていました。 ところが以下のようなプログラムを実行してみると問題なくコンパイル出来る上に問題なく実行できました。 int main(void) { int main; main = 300; printf("%d\n", main); return 0; } 確かに入門書などを見直してみると、予約語の中に"main"はありませんでしたし、関数名が変数名として使えないとは書いて無いように思います。 でもなんだかしっくりきません。(^^;) 関数ポインタを使う際などは、変数=関数名(p = myfunction)などと書いたりするので、main関数が格納されているメモリなど変なところを書き換えたりしている可能性があるような気がしたのですが、うまく確認する方法を思いつきませんでした・・・。 ただたんに変数が優先的に処理されているだけというのなら納得するしかないのですが。 どなたか詳しい方がいたら教えてください。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>予約語の中に"main"はありませんでしたし、 「main」は「単なる識別子」です。 「int num;」と書いた時の「num」と同じ扱いです。 「void sub(void)」と書いた時の「sub」と同じ扱いです。 「num」「sub」と「main」の唯一の違いは「mainはライブラリのスタートアップルーチンから自動的に呼び出される」だけで、他は何も違いません。 >関数名が変数名として使えないとは書いて無いように思います。 これは「識別子のスコープの問題」です。 「int main(void)」は「外部から参照される」ので「グローバルなスコープ」を持ちます。 「int main」は「関数内でしか参照されない」ので「局所的な一時的スコープ」しか持ちません。 で「異なるスコープで同一名の識別子を定義した場合」には「内側のスコープは、外側のスコープを覆い隠す」事になっています(例参照) 例 int b=0,c=0; int main(void) { int a,b,c; b=c=1; printf("%d %d\n",b,c); //「1 1」が表示される sub(); for (a=0;a<10;a++) { int b,c; b=c=-1; printf("%d %d\n",b,c); //「-1 -1」が表示される } printf("%d %d\n",b,c); //「1 1」が表示される } void sub(void) { printf("%d %d\n",b,c); //「0 0」が表示される } この例では「グローバルな変数b、c」、「main関数ブロック内の変数b、c」、「for文ブロック内の変数b、c」は「同じ名前だけど、すべて異なる変数」として扱われます。 これと同じで、質問文にある「関数main」と「変数main」は「同じ名前だけど、異なる識別子」として扱われます。 因みに、以下のようなプログラムも(インテル系のCPUに限り)コンパイルして実行出来てしまいます。 extern char main[]; char main[]={ 0x90,0x90,0x90,0xc3 //マシン語の命令を16進で直接記述 };
その他の回答 (1)
- Werner
- ベストアンサー率53% (395/735)
関数名mainとローカル変数mainはスコープが異なるので 名前が同じだけで別のものとして区別されます。 もし > double main; > int main() > { > return 0; > } のように記述した場合は、 2つのmainが同一のスコープになってしまうためエラーになります。 詳しいことは以下のページを読んでください。 C言語の構文解析 http://www.syuhitu.org/other/cparse/cparse.html C言語編 第22章 変数のスコープ http://www.geocities.jp/ky_webid/c/022.html
お礼
早速の回答ありがとうございました。 私が勉強不足でした(^^;)
お礼
大変詳しい回答をありがとうございました。 これを機にいろいろ実験してみたいと思います。