アプリ版:「スタンプのみでお礼する」機能のリリースについて

まず、処理がエラーだと-1を返し、正常だと0を返す関数が2つあり、それぞれint funcA()、int funcB()とします。
この時、それらとは別の関数で以下のようにreturn文を書くとどのように値を返しますか?

return funcA() || funcB();

共に0を返す時、どちらかが0を返し他方は-1を返す時、共に-1を返す時についてご教示願います。

またあえてこのように記述するくらいならノーマルに以下の記述の方が良いですか?

if (funcA() != 0 || funcB() != 0 ) {
return -1;
} else {
return 0;
}

(インデントしていないので読みづらかったらすみません)

A 回答 (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;
}

この回答への補足

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

補足日時:2014/07/24 10:12
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/07/24 09:20

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;

です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/07/24 10:01

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2014/07/24 10:07

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++)
だと、やはり、安心できないと言うことですね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/07/24 10:01

>コンパイルオプションによって変わるということはありません


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

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

お礼日時:2014/07/24 09:56

#4の方へ。



|| の動作が書く場所によって変わったりコンパイルオプションによって変わるということはありません。
    • good
    • 0
この回答へのお礼

ですよね...

お礼日時:2014/07/24 09:54

>return文を書くとどのように値を返しますか?


処理が(どちらか一方でも両方でも)エラーだと-1を返し正常だと0を返すことになります

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

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

お礼日時:2014/07/24 09:34

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

この回答への補足

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

補足日時:2014/07/24 09:52
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/07/24 09:26

printf("%d\n", ( 0 || 0 ));


printf("%d\n", ( 0 || -1 ));
printf("%d\n", ( -1 || 0 ));
printf("%d\n", ( -1 || -1 ));
これを実行してみれば分かる。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/07/24 09:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!