「いんすう」って呼ばないで! 関数概略
今回はコード少なめなのでご安心を。
つーことで早速今回のコードを載せます。
--------
#include <stdio.h>
int add(int a1,int a2);
int main(){
int a = 1;
int b = 5;
int c = add(a,b);
printf("a=%d:b=%d:c=%d\n",a,b,c);
return 0;
}
int add(int a1,int a2){
return a1 + a2;
}
--------
はい、短いですね。
今回は「関数」の使い方についてです。
細かいことを言えば深くなるのですが浅いことには定評のある筆者なので浅く触れていきます。
まず一行目のincludeは無視します、いつものアレです、おまじない。
で、重要なのが
int add(int a1,int a2);
です。
じつは下の関数本体をここに書けばこれ要らないです。
じゃあなんでわざわざこんな書き方をしたかというと、「読みやすい」からです。
自分しか読まないコードでも数日それを見ないだけで、「アレってなんだっけ?」となります。
格言に「3日前の自分は他人」というような意味のものもあります。
ですから将来のために「お行儀のいい」コードを書きましょう。
では解説。
addという名前から想像がつく通り括弧内の2つの数を足して返す関数です。
下の方にある本体の
return a1 + a2;
が与えられた(今回はaとb)を足したものを返して今回はcに代入しています。
皆さんの予想通り実行結果はこうなります。
--------
a=1:b=5:c=6
--------
というわけでaの1とbの5を足した数をcに入れてそれを表示しています。
ちゃんと1と5を足した数が入っているのが解ると思います。
ここで横着な人は
c = a + b;
じゃ駄目なの? という疑問だと思います。
それは今回については全く持ってごもっともな指摘であり、今回は関数化する必要はないです。
じゃあ足す数が10個あってそれを5回行う場合どうでしょうか?
関数本体はこうなります。
-------
int add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9){
return a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9;
}
-------
こうなります。
で、呼び出しは、
-------
add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
-------
こうなります。
直接書くと
------
c = a0 + a1 + ....
-------
書くのが面倒になりましたのでどちらが楽かは賢明な読者の皆様に委ねます。
というわけで、みなさんももっと楽をするために関数化をしましょうね!
[hirokazu@sisters 4]$ vim AnP.txt
[hirokazu@sisters 4]$ cat AnP.txt
今回はコード少なめなのでご安心を。
つーことで早速今回のコードを載せます。
--------
#include <stdio.h>
int add(int a1,int a2);
int main(){
int a = 1;
int b = 5;
int c = add(a,b);
printf("a=%d:b=%d:c=%d\n",a,b,c);
return 0;
}
int add(int a1,int a2){
return a1 + a2;
}
--------
はい、短いですね。
今回は「関数」の使い方についてです。
細かいことを言えば深くなるのですが浅いことには定評のある筆者なので浅く触れていきます。
まず一行目のincludeは無視します、いつものアレです、おまじない。
で、重要なのが
int add(int a1,int a2);
です。
じつは下の関数本体をここに書けばこれ要らないです。
じゃあなんでわざわざこんな書き方をしたかというと、「読みやすい」からです。
自分しか読まないコードでも数日それを見ないだけで、「アレってなんだっけ?」となります。
格言に「3日前の自分は他人」というような意味のものもあります。
ですから将来のために「お行儀のいい」コードを書きましょう。
では解説。
addという名前から想像がつく通り括弧内の2つの数を足して返す関数です。
下の方にある本体の
return a1 + a2;
が与えられた(今回はaとb)を足したものを返して今回はcに代入しています。
皆さんの予想通り実行結果はこうなります。
--------
a=1:b=5:c=6
--------
というわけでaの1とbの5を足した数をcに入れてそれを表示しています。
ちゃんと1と5を足した数が入っているのが解ると思います。
ここで横着な人は
c = a + b;
じゃ駄目なの? という疑問だと思います。
それは今回については全く持ってごもっともな指摘であり、今回は関数化する必要はないです。
じゃあ足す数が10個あってそれを5回行う場合どうでしょうか?
関数本体はこうなります。
-------
int add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9){
return a0 + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9;
}
-------
こうなります。
で、呼び出しは、
-------
add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
add(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
-------
こうなります。
直接書くと
------
c = a0 + a1 + ....
-------
書くのが面倒になりましたのでどちらが楽かは賢明な読者の皆様に委ねます。
というわけで、みなさんももっと楽をするために関数化をしましょうね!
ところで、気づいた方もいるでしょうがmain()も関数の一つなんですね。
言語によっては1行目から実行されるものもありますがCではmain()から始まります。
main()には引数は無いの? と思われるでしょう、実はあるんです。
悪名高いポインタが絡んでくるので今までは省略していました、正式に書くとmainはこうなります。
-----
int main(int argc, char *argv[])
-----
はい、わかんないですね。
一応説明しておくとargcには与えられる引数の数、argvには引数のポインタが入っています。
でもmainにどこから引数を与えるの? という疑問が生まれますね。
答えは実行時に与える。です。
コンパイルして出来たのがa.outだったらこのように与えます。
-----
./a.out helloworld
-----
これでhelloworldという引数を渡しています。
なんでスペース入れないんだよ読みにくいだろ! という意見もあるでしょうがスペースを入れるとそれが区切りになってhelloとworldという2つの引数になるんですね。
一応参考までに引数を与えるhelloworldも書いておきます。
-----
#include <stdio.h>
int main(int argc, char *argv[]){
printf("%s\n",argv[1]);
return 0;
}
-----
これだけです、実行にはコマンドで「./a.out helloworld」と実行すると
helloworld
と表示されます。
注意するところはargv[0]には実行ファイルの名前が入るのでargv[0]は「./a.out」が入ってます。
以上、関数入門でした。
main()の引数に関してはポインタに踏み込むので厄介事を避けるため今回は「へーこうなるんだ」くらいに思っておいて深く考えないほうがいいでしょう。
お読みいただきありがとうございます!