- ベストアンサー
C/C++関数の返却値を返す方法
- C/C++の関数で返却値を返す方法を教えてください。
- return文で関数の返却値を返す方法について教えてください。
- C/C++の関数の返却値について詳しく教えてください。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
たかだか4とおりしかないので、 こんなコードを書いてみて、 funcA()とfuncB()の戻り値をいろいろ いじくってみると、興味深い結果を得るかもしれません。 #include <stdio.h> int funcA(void) { return 0; } int funcB(void) { return 0; } int f(void) { return funcA() || funcB(); } int main(void) { printf("%d\n", f()); return 0; }
その他の回答 (8)
- 麻野 なぎ(@asano_nagi)
- ベストアンサー率35% (42/120)
No.7 です。 確かに間違ってました > #8 しばらく考え込んでしまいましたけど このあたりで、 a && b は、 if (! a) return 0; else return !!b; a || b は、 if (a) return 1; else return !!b; あるいは a && b は、 if (! a) return 0 else if (! b) return 0; else return 1; a || b は、 if (a) return 1; else if (b) return 1; else return 0; です。
お礼
重ね重ねありがとうございますm(__)m
- Tacosan
- ベストアンサー率23% (3656/15482)
最初のところ, 評価「順序」はその通りですが「結果」は違ってますよ>#7.
お礼
No.3さんの補足で書きましたが、確かに返却するのはtrue falseなので1か0ですね。 このことを鑑みると質問の二式は全く違うものでした。 すみませんm(__)m
- 麻野 なぎ(@asano_nagi)
- ベストアンサー率35% (42/120)
Cにおいて、&& と || は、評価順序が規格で決まっており、 a && b は、 if (! a) return a else return b; a || b は、 if (a) return a else return b; という評価を行います。 なので、どのような書き方であっても、結果が決まった時点で評価は打ち切られます。 return funcA() || funcB(); の場合、funcA() の返値が、0 でなければ、funcB() は、実行されません。(というか、評価されません) だから、 for(i = 0; i < N && a[i] != 0; i++) という式が平気でかけるのです。 (i >= N になった時点で、評価は打ち切られるので、i >=N であるような、a[i] が参照されることはない) この場合、 for(i = 0; a[i] != 0 && i < N; i++) だと、やはり、安心できないと言うことですね。
お礼
あれ、return文でも短絡評価が行われるんでしたっけ? NO.4/6さんのお礼で適当なこと書いちゃったかな... 記憶が曖昧でよく分かりませんが。 回答ありがとうございましたm(__)m
- koi1234
- ベストアンサー率53% (1866/3459)
>コンパイルオプションによって変わるということはありません 昔の環境なので記憶間違いかもしれませんが 実際に使っていた環境で コンパイルオプション (最適化か何かのオプションだった記憶有)にて そういった違いが発生するといったことがあったような記憶がありますので 一応書かせていただいています
お礼
あ、そうなんですか... 使用しているのはVS2013なので恐らくそういうことはないと思いますが。 開発環境を書き忘れていたせいで混乱を招いたようですみませんでしたm(__)m
- wormhole
- ベストアンサー率28% (1626/5665)
#4の方へ。 || の動作が書く場所によって変わったりコンパイルオプションによって変わるということはありません。
お礼
ですよね...
- koi1234
- ベストアンサー率53% (1866/3459)
>return文を書くとどのように値を返しますか? 処理が(どちらか一方でも両方でも)エラーだと-1を返し正常だと0を返すことになります >以下の記述の方が良いですか 判定結果だけでいえばどちらの方法で書いても変わらないと思いますが 動作として考えた場合 (これはコンパイルオプションや環境などによっても変わる場合があります) return で書いた場合には 必ず funcA() funcB() が実行されますが if文で書いた場合には ・funcAがエラーだったときときfuncBは処理されない(多分ほとんどはこちらの動作) ・funcAとfuncB両方とも処理される といった違いが出ることがあります
お礼
return文の論理和は両オペランドを評価し、if文の論理和は左辺のオペランドがtrueだと右辺のオペランドを評価しないのでしたね、忘れていました。 そして-1がtrueであることも... 流石に論理和の処理がコンパイラによって変わることはないと思いますが、変わるんですかね? ともかく、回答ありがとうございましたm(__)m
- Tacosan
- ベストアンサー率23% (3656/15482)
いちおうかくにんですが, 「値」についてだけ気をつければ十分ですか?
お礼
左様です。 両関数を返却する関数の返却値型を書き忘れていましたがint型ですので。
補足
お礼を書いてから気付いたのですが、返却されるのはbool型をint型に変換した値ですね。。。 0 || 0 = false || false → return false = 0 0 || -1 = false || true → return true = 1 -1 || 0 = true || false → return true = 1 -1 || -1 = true || true → return true = 1
- Gotthold
- ベストアンサー率47% (396/832)
printf("%d\n", ( 0 || 0 )); printf("%d\n", ( 0 || -1 )); printf("%d\n", ( -1 || 0 )); printf("%d\n", ( -1 || -1 )); これを実行してみれば分かる。
お礼
No.1の方のお礼にも書きましたが、確かにわざわざ質問するような内容でもありませんでしたね。 回答ありがとうございましたm(__)m
お礼
確かに自分で検証出来る内容でしたね。。。 回答ありがとうございましたm(__)m
補足
みなさん回答ありがとうございましたm(__)m どの方をBAにするか迷ったのですが、一番最初に回答して下さったのでasuncionさんとさせていただきます。