ページ 11

関数での素朴な疑問。

Posted: 2012年8月31日(金) 17:58
by kerukukku1
Mac OS X ver.10.8で、Objective-cに触れてみたんですが、
進めて行っているうちに、関数がよくわからなくなってしまいました。



#import <Foundation/Foundation.h>

int rei(int a);

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

@autoreleasepool {

// insert code here...
int n = rei(100);

NSLog(@"合計=%d", n);
}
return 0;
}

int rei(int a)
{
int goukei = a + 100 + 100;

return goukei;
}

結果:
合計=300

これなんですが、
上にある
int rei(int a)の部分なんですが、
なぜ
void rei(int a)
ではなく、intで書くんでしょうか。

多分自分が戻り値についてよく理解していないのが要因だとおもうので、
もし時間があったら戻り値についてのわかりやすい解説
(というよりintとvoidの違い?)を載せていただけるとうれしいです。

Re: ポインターでの素朴な疑問。

Posted: 2012年8月31日(金) 18:17
by box
まず、タイトルにある「ポインターでの素朴な疑問」と、
実際の投稿内容との間には何の関係もないことを申し上げます。
ポインターに関するご質問をされてはいません。

【注記】上記の回答をした後、質問者さんご自身が投稿のタイトルを修正されたようです。
kerukukku1 さんが書きました: int n = rei(100);

int rei(int a)
{
int goukei = a + 100 + 100;

return goukei;
}
reiという関数は、引数で渡した値(今回の例では100)に200を加えた値を、呼び出し元に
『計算結果として返す』
という機能を持っています。
この、『計算結果として返す』というのが、rei関数の戻り値(今回はint型)に相当します。

Re: 関数での素朴な疑問。

Posted: 2012年8月31日(金) 18:29
by kerukukku1
あ、すみませんw
ポインターの勉強をしてたもんでつい書いてしまいました汗
関数に訂正しておきます。

rei関数が、引数で渡した値が今回の場合100、で
200に加えた値を呼び出し元に返す。ということは理解できました。

ですが、結局voidとintでは何が違うのでしょうか?
intでrei関数を書いた場合は、「計算結果として返す」という機能ならば、
voidで書いた場合は同じく「計算結果として返す」なのでしょうか?

Re: 関数での素朴な疑問。

Posted: 2012年8月31日(金) 18:34
by non
kerukukku1 さんが書きました:voidで書いた場合は同じく「計算結果として返す」なのでしょうか?
voidは値を返さない関数です。
C言語は値を返さない場合でも関数というから、まぎわらしいですね。
言語によっては「手続き」とか「subプロシージャ」とか言って、「ファンクション」とは区別してますけどね。

Re: 関数での素朴な疑問。

Posted: 2012年8月31日(金) 18:38
by 雨ガエル
戻り値について説明します。変数に型がありますが、関数にも型があります。
この”関数の型”は「関数の戻り値の型」です。
void型の関数は値を返しません。
したがってint rei(int a)という関数はint型の数を返します。
もしvoid rei(int a)にしてしまったら、値を返さないので、
int n = rei(100); はうまくいきません。

まとめると
int型の関数はint型の数を返す。
void型の関数は値を返さない。
です。

うまく説明できていないかも知れませんが、関数の戻り値はこんなものです。

たとえば 引数に指定した二つの数を足す、int plus(int A,int B)という関数があったとします。
この関数の中身は、
int plus(int A,int B)
{
int C = A+B;
return C;
}
です。
return C; というのは”変数Cを返す”という意味です。
返したい変数Cはint型なので、このplus関数の型はint型にします。

Re: 関数での素朴な疑問。

Posted: 2012年8月31日(金) 19:05
by kerukukku1
>>nonさん

なるほど、voidは値を返さないということですか。
確かにこれも関数って呼ぶと紛らわしいですね笑

Re: 関数での素朴な疑問。

Posted: 2012年8月31日(金) 19:09
by kerukukku1
>>雨ガエルさん

なるほど、
値を返さないとこのプログラムはうまく動作するはずないですね。
ということは、voidは値を返さない場合に使用するってことですね!
returnでintでつくった変数を関数に戻すということか
とてもわかりやすかったです!
皆様ありがとうございました!