戻り値と引数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ざこ

戻り値と引数

#1

投稿記事 by ざこ » 16年前

【戻り値に関するご質問】
戻り値の概念がひどく曖昧です。戻り値というものを調べると関数に値を返すとだけ書いてあります。
その返すという表現がひどく曖昧です。

①何故値を返すのですか?(void型は例外)決まりなのですか?
②若干①とかぶりますが値を返すとどうなるのですか?
char *str_chr(const char *s,int c)
{
  c=(char);
  while(*s!=c){
    if(*s=='\0')
      return (NULL);
    s++
  }
  return((char *)s);
}
例えば上記の例で言うとどういう風になるのでしょう。

【引数に関するご質問】
char *str_chr(const char *s,int c)
{
  c=(char);
  while(*s!=c){
    if(*s=='\0')
      return (NULL);
    s++
  }
  return((char *)s);
}

int main(void)
{
   char *ptr;
   char ch[2];
   char letter[/url]="ABCDEFGHIJKLMN";

   printf("英大文字を入力してください\n");
   scanf("%s",&ch);
  
 if((ptr=str_chr(letter,ch[0]))==NULL)
    printf("%cは英大文字ではありません\n",ch[0]);
  else
    printf("%cからの跡のアルファベットは%sです\n",ch[0],ptr);
  return 0;
}
実引数と狩引数は別の文字でも構わないとは聞いたことありますが

(const char *s,int c)の値が(letter,ch[0])に渡されていますよね。
型まで完全に違うのに渡せるっというのはイメージが掴みずらいのですが、
説明していただける方いませんか?

御津凪

Re:戻り値と引数

#2

投稿記事 by 御津凪 » 16年前

# なにか構文的におかしいのは置いといて、

str_chr 関数は、文字列 s の中から、文字 c を先頭から探し、一致した箇所のポインタを返す、
というものですね。
この、「返す」値が戻り値です。

プログラムの関数は、数学の関数と同じで、三角関数(角度に対応する0~1の値を返す)を考えると
戻り値の意味が分かりやすいかと思います。


次に引数のほうですが、

char*(データを書き換え可能なポインタ型)

const char*(データを書き換えられないポインタ型)

と、変換されています(これは可能)。
この逆はエラーになります。
読み込み専用のデータを勝手に書き換え可能にするのは困りますよね。

もう一つの方は、一バイト文字を表す char 型から、 int 値に変換されています。
これは、変換しても値が変化しないため、問題がないためです。

逆の方では、コンパイル環境(オプション)によっては警告、あるいはエラーが出ます。
int 型は char 型よりも大きい数値を表せるため、 int -> char では数値を維持できないことになり、
値が変化してしまいます。
( int 値が char 型で表せる範囲の値であれば、 char 型に代入しても値に変化はありません)

このように暗黙的に変換できるものは、
・整数型(小) -> 整数型(大)
・float      -> double
・void*      -> const void* (ポインタ型ならどれでも)
等があります。

non

Re:戻り値と引数

#3

投稿記事 by non » 16年前

>実引数と狩引数は別の文字でも構わないとは聞いたことありますが

仮引数です。「別の文字でもかまわない」というよりも「同じ名前でもかまわない」と言った方が良いかと。
つまり、名前はたとえ同じでも、別の箱(変数)だと考えてください。
仮引数はその関数内だけしか存在しません。関数から帰るとき、破棄されます。

>(const char *s,int c)の値が(letter,ch[0])に渡されていますよね。
>型まで完全に違うのに渡せるっというのはイメージが掴みずらいのですが、

御津凪さんの説明でわかったかと思いますが、代入だと考えてください。
つまり、
 仮引数=実引数;
ですから、型がちがっても、普通の代入文と同じように自動的に型が変換されるときもあるということですね。

box

Re:戻り値と引数

#4

投稿記事 by box » 16年前

> 戻り値の概念がひどく曖昧です。戻り値というものを調べると関数に値を返すとだけ書いてあります。
> その返すという表現がひどく曖昧です。

中学校あたりの数学でも「関数」という概念が登場しますね。
例えば、y=2x+1 という関数は、「もらったデータを2倍して1を足した結果を返す」という
仕事をします。
この関数に、
1を渡すと3が返ってくる
2を渡すと5が返ってくる
3を渡すと7が返ってくる
ことはおわかりかと思います。
このとき、「○を渡すと□が返ってくる」の○がC言語でいうところの引数で、□が戻り値(返り値)です。
そして、○から□に変換する方法(2倍して1を足す)が関数の中身(関数の仕事)です。


そんなことはとっくの昔にわかっている、ということでしたら、
上の回答は無視してください。

たかぎ

Re:戻り値と引数

#5

投稿記事 by たかぎ » 16年前

> ひどく曖昧です。

曖昧ではない厳密な情報が欲しいのであれば、規格書を読むことをお勧めします。

閉鎖

“C言語何でも質問掲示板” へ戻る