まず、処理がエラーだと-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;
}
(インデントしていないので読みづらかったらすみません)
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;
}
この回答への補足
みなさん回答ありがとうございましたm(__)m
どの方をBAにするか迷ったのですが、一番最初に回答して下さったのでasuncionさんとさせていただきます。
No.3
- 回答日時:
いちおうかくにんですが, 「値」についてだけ気をつければ十分ですか?
この回答への補足
お礼を書いてから気付いたのですが、返却されるのは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
No.4
- 回答日時:
>return文を書くとどのように値を返しますか?
処理が(どちらか一方でも両方でも)エラーだと-1を返し正常だと0を返すことになります
>以下の記述の方が良いですか
判定結果だけでいえばどちらの方法で書いても変わらないと思いますが
動作として考えた場合
(これはコンパイルオプションや環境などによっても変わる場合があります)
return で書いた場合には 必ず funcA() funcB() が実行されますが
if文で書いた場合には
・funcAがエラーだったときときfuncBは処理されない(多分ほとんどはこちらの動作)
・funcAとfuncB両方とも処理される
といった違いが出ることがあります
return文の論理和は両オペランドを評価し、if文の論理和は左辺のオペランドがtrueだと右辺のオペランドを評価しないのでしたね、忘れていました。
そして-1がtrueであることも...
流石に論理和の処理がコンパイラによって変わることはないと思いますが、変わるんですかね?
ともかく、回答ありがとうございましたm(__)m
No.5
- 回答日時:
#4の方へ。
|| の動作が書く場所によって変わったりコンパイルオプションによって変わるということはありません。
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++)
だと、やはり、安心できないと言うことですね。
あれ、return文でも短絡評価が行われるんでしたっけ?
NO.4/6さんのお礼で適当なこと書いちゃったかな...
記憶が曖昧でよく分かりませんが。
回答ありがとうございましたm(__)m
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;
です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- JavaScript 正規表現について質問です。条件に合う場合はtrueを返したい 3 2022/10/06 23:02
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TOEFLでadhdすぎて
-
C言語をコンパイルするとコンピ...
-
こんなことてしますか??
-
どちのほうがすきですか?
-
Notepad++の関数リスト表示の変...
-
あなたは、Excelはどうやって学...
-
これなにがちがうんですか??
-
ArduinoのジャイロモジュールMP...
-
[C言語]fputsとfprintfの違い
-
システムエンジニアの適正について
-
Stuck
-
ArduinoでMouse関数を使用して...
-
Linuxでの開発環境構築や設定の...
-
c言語
-
プログラミング言語の制作方法...
-
C++でデスクトップGUIアプリ開...
-
mallocについて
-
C言語 配列と関数の練習問題
-
WindowsのCapsLock(キャップス...
-
Notepad++の関数リスト表示でC...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
プログラミングが分かりません。
-
'printf':識別子が見つかりませ...
-
C言語のエラーについて
-
Expression: nptr != NULL
-
TCP/IP: 非ソケットに対するソ...
-
加減剰余のオーバーフローについて
-
3×3のラテン方陣をつくるプログ...
-
プログラムがエラーが出る原因
-
コマンドライン引数について。
-
getch / putch用のヘッダ
-
C言語で自作ヘッダーを作ったの...
-
コンソールAPIのSetConsoleScre...
-
C言語 コンパイルエラー(文字...
-
リターンキー又は、スペースキ...
-
分割コンパイルの手順と方法に...
-
C言語初心者です。計算がうまく...
-
モンテカルロ法で三角錐の体積...
-
最も文字数が多い行番号と文字...
-
C言語のソースコードについて教...
おすすめ情報