• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C/C++ return文で関数の返却値を返却)

C/C++関数の返却値を返す方法

このQ&Aのポイント
  • C/C++の関数で返却値を返す方法を教えてください。
  • return文で関数の返却値を返す方法について教えてください。
  • C/C++の関数の返却値について詳しく教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

たかだか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; }

e141916
質問者

お礼

確かに自分で検証出来る内容でしたね。。。 回答ありがとうございましたm(__)m

e141916
質問者

補足

みなさん回答ありがとうございましたm(__)m どの方をBAにするか迷ったのですが、一番最初に回答して下さったのでasuncionさんとさせていただきます。

その他の回答 (8)

回答No.9

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; です。

e141916
質問者

お礼

重ね重ねありがとうございますm(__)m

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

最初のところ, 評価「順序」はその通りですが「結果」は違ってますよ>#7.

e141916
質問者

お礼

No.3さんの補足で書きましたが、確かに返却するのはtrue falseなので1か0ですね。 このことを鑑みると質問の二式は全く違うものでした。 すみませんm(__)m

回答No.7

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++) だと、やはり、安心できないと言うことですね。

e141916
質問者

お礼

あれ、return文でも短絡評価が行われるんでしたっけ? NO.4/6さんのお礼で適当なこと書いちゃったかな... 記憶が曖昧でよく分かりませんが。 回答ありがとうございましたm(__)m

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.6

>コンパイルオプションによって変わるということはありません 昔の環境なので記憶間違いかもしれませんが 実際に使っていた環境で コンパイルオプション (最適化か何かのオプションだった記憶有)にて そういった違いが発生するといったことがあったような記憶がありますので 一応書かせていただいています

e141916
質問者

お礼

あ、そうなんですか... 使用しているのはVS2013なので恐らくそういうことはないと思いますが。 開発環境を書き忘れていたせいで混乱を招いたようですみませんでしたm(__)m

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

#4の方へ。 || の動作が書く場所によって変わったりコンパイルオプションによって変わるということはありません。

e141916
質問者

お礼

ですよね...

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.4

>return文を書くとどのように値を返しますか? 処理が(どちらか一方でも両方でも)エラーだと-1を返し正常だと0を返すことになります >以下の記述の方が良いですか 判定結果だけでいえばどちらの方法で書いても変わらないと思いますが 動作として考えた場合 (これはコンパイルオプションや環境などによっても変わる場合があります) return で書いた場合には 必ず funcA() funcB() が実行されますが if文で書いた場合には ・funcAがエラーだったときときfuncBは処理されない(多分ほとんどはこちらの動作) ・funcAとfuncB両方とも処理される といった違いが出ることがあります

e141916
質問者

お礼

return文の論理和は両オペランドを評価し、if文の論理和は左辺のオペランドがtrueだと右辺のオペランドを評価しないのでしたね、忘れていました。 そして-1がtrueであることも... 流石に論理和の処理がコンパイラによって変わることはないと思いますが、変わるんですかね? ともかく、回答ありがとうございましたm(__)m

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

いちおうかくにんですが, 「値」についてだけ気をつければ十分ですか?

e141916
質問者

お礼

左様です。 両関数を返却する関数の返却値型を書き忘れていましたがint型ですので。

e141916
質問者

補足

お礼を書いてから気付いたのですが、返却されるのは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)
回答No.2

printf("%d\n", ( 0 || 0 )); printf("%d\n", ( 0 || -1 )); printf("%d\n", ( -1 || 0 )); printf("%d\n", ( -1 || -1 )); これを実行してみれば分かる。

e141916
質問者

お礼

No.1の方のお礼にも書きましたが、確かにわざわざ質問するような内容でもありませんでしたね。 回答ありがとうございましたm(__)m

関連するQ&A