「C言語/中級者向けの話題」の版間の差分

削除された内容 追加された内容
プロパティ lang=c を lang="C" に更新。
→‎関数: 仮引数について、ココを読むユーザが興味アルのは仮引数をもつ場合なので、仮引数の有無の説明の順序では、仮引数のある場合を先に紹介するように順序変更。
72 行
 
== 関数 ==
=== 関数の実行環境 ===
==== フリースタンディング環境 ====
オペレーティングシステムのいかなる支援もなしにCプログラムを実行する環境を、
フリースタンディング環境という。
フリースタンディング環境では、
プログラムの開始時に呼び出される関数の名前および型は処理系定義である。
フリースタンディング環境では、複素数型を使ってはいけない。
フリースタンディング環境でプログラムが利用できるライブラリ機能は、
<float.h>, <iso646.h>, <limits.h>, <stdarg.h>,
<stdbool.h>, <stddef.h>, <stdint.h>
であり、<ref>『JISX3010:2003』p.5「4 規格合致性」</ref>
これ以外は処理系定義である。
<ref>『JISX3010:2003』p.8「5.1.2.1 フリースタンディング環境」</ref>
 
==== ホスト環境 ====
オペレーティングシステムの支援ありでCプログラムを実行する環境を、
ホスト環境という。<ref>『JISX3010:2003』p.8「5.1.2.2 ホスト環境」</ref>
ホスト環境では、プログラム開始処理において呼び出される関数の名前はmainである(エントリポイント)。
main関数とはプログラムの開始処理において、
いろいろな初期化処理の後、最初に呼び出される関数である。
たいていのプログラムはこのmain関数から始まると考えてよい。
main関数には大まかに分けてプログラム仮引数(コマンドライン引数)を持たない関数と持つ関数との2種類の記述方法がある。
 
*=== プログラム仮引数とは ===
==== 仮引数とは何か ====
プログラムを実行する際、プログラムに対して渡される情報を、プログラム仮引数と呼ぶ。
コマンドラインから実行ファイル名などを入力してプログラムを実行する際、実行ファイルに文字列データを渡すことができる。
 
方法は、コンパイル後に、単にコマンド入力で、たとえば
$ 実行ファイル名 moji
のように、ファイル名の後ろに、渡したい文字列を書けばいい。(上記コマンドの場合なら文字列「moji」が渡される)
 
このように、プログラムに対して渡される情報を、プログラム仮引数と呼ぶ。
 
例えばコマンドプロンプトにおいて、
 
107 ⟶ 94行目:
「example.exe」、「ABC」、「DEF」、「GHI」という4個の文字列が渡される。
 
 
* プログラム仮引数を持たない関数
プログラム仮引数を使しない場合するにはソースコードように仮引数をもたないmain関数を記述する。
 
<syntaxhighlight lang="C">
void main(int argc, char *argv[]) {
int main(void)
// 以下略
{
</syntaxhighlight>
/*いくつかの文*/
 
のようにmain関数に引数<code> int argc, char *argv[] </code> をこの順番で書けばいい。
 
この順番を守ること。
 
第一引数の整数型の引数は、コマンドライン入力時の単語の数である。(実行ファイル名も単語1個ぶんとして数える。)
 
たとえばコマンド入力が
<syntaxhighlight lang="C">
C:\example.exe ABC DEF GHI
</syntaxhighlight>
なら、argcは4になる。
 
上記の例の場合
:argv[0]は実行ファイル名「example.ex」であり、
:argv[1]は 「ABC」 であり、
:argv[2]は 「DEF」 であり、
:argv[3]は 「GHI」 である。
 
 
;コード例
下記コードは、実行時に「ja」と追記することで、日本語で「こんにちは」とアイサツをするプログラムである。単に実行ファイル名だけを入力した場合、英語で「hello」と答える。
 
<syntaxhighlight lang="C">
#include "stdio.h"
#include "string.h"
 
void main(int argc, char *argv[]) {
 
if (argc == 1) {
printf("hello");
}
 
if (argc >= 2) {
 
// strcmpは文字列比較して同じなら0を返す関数
 
if ( strcmp(argv[1], "en")==0 ) {
printf("hello");
}
 
if ( strcmp(argv[1], "ja")==0 ) {
printf("こんにちは");
}
}
}
</syntaxhighlight>
 
コマンド入力は、ファイル名が example.exe なら、コンパイル後にたとえば
* プログラム仮引数を持つ関数
<syntaxhighlight lang="C">
example.exe ja
</syntaxhighlight>
のように入力すれば、日本語で「こんにちは」と答える。
 
==== 詳細 ====
===== プログラム仮引数を持つ関数 =====
プログラム仮引数を使用する場合、次のように2つの仮引数をもつ関数を記述する。
 
<syntaxhighlight lang="C">
int main(int argc, char *argv[])
126 ⟶ 166行目:
</syntaxhighlight>
 
:argcはプログラム仮引数の個数である。
:argvはプログラム仮引数を表す文字列の配列へのポインタである。
:argv[0]が指す文字列はプログラム名である。
:argcにはこのプログラム名も個数として数えられる。
 
ただし、argcが0の場合、argv[0]は空ポインタである。
151 ⟶ 191行目:
}
</syntaxhighlight>
 
 
===== プログラム仮引数を持たせない場合 =====
プログラム仮引数を使用したくない場合には、単に下記のように main 関数の引数を void あるいは空白にすればいいだけである。こうすれば、仮引数をもたないとして処理される。
 
<syntaxhighlight lang="C">
int main(void)
{
/*いくつかの文*/
}
</syntaxhighlight>
 
 
=== 関数の実行環境 ===
==== フリースタンディング環境 ====
オペレーティングシステムのいかなる支援もなしにCプログラムを実行する環境を、
フリースタンディング環境という。
フリースタンディング環境では、
プログラムの開始時に呼び出される関数の名前および型は処理系定義である。
フリースタンディング環境では、複素数型を使ってはいけない。
フリースタンディング環境でプログラムが利用できるライブラリ機能は、
<float.h>, <iso646.h>, <limits.h>, <stdarg.h>,
<stdbool.h>, <stddef.h>, <stdint.h>
であり、<ref>『JISX3010:2003』p.5「4 規格合致性」</ref>
これ以外は処理系定義である。
<ref>『JISX3010:2003』p.8「5.1.2.1 フリースタンディング環境」</ref>
 
==== ホスト環境 ====
オペレーティングシステムの支援ありでCプログラムを実行する環境を、
ホスト環境という。<ref>『JISX3010:2003』p.8「5.1.2.2 ホスト環境」</ref>
ホスト環境では、プログラム開始処理において呼び出される関数の名前はmainである(エントリポイント)。
main関数とはプログラムの開始処理において、
いろいろな初期化処理の後、最初に呼び出される関数である。
たいていのプログラムはこのmain関数から始まると考えてよい。
 
 
ホスト環境では、プログラムは、全てのライブラリ機能を使用してよい。