まず、処理がエラーだと-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.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;
です。
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.6
- 回答日時:
>コンパイルオプションによって変わるということはありません
昔の環境なので記憶間違いかもしれませんが
実際に使っていた環境で コンパイルオプション
(最適化か何かのオプションだった記憶有)にて
そういった違いが発生するといったことがあったような記憶がありますので
一応書かせていただいています
あ、そうなんですか...
使用しているのはVS2013なので恐らくそういうことはないと思いますが。
開発環境を書き忘れていたせいで混乱を招いたようですみませんでしたm(__)m
No.4
- 回答日時:
>return文を書くとどのように値を返しますか?
処理が(どちらか一方でも両方でも)エラーだと-1を返し正常だと0を返すことになります
>以下の記述の方が良いですか
判定結果だけでいえばどちらの方法で書いても変わらないと思いますが
動作として考えた場合
(これはコンパイルオプションや環境などによっても変わる場合があります)
return で書いた場合には 必ず funcA() funcB() が実行されますが
if文で書いた場合には
・funcAがエラーだったときときfuncBは処理されない(多分ほとんどはこちらの動作)
・funcAとfuncB両方とも処理される
といった違いが出ることがあります
return文の論理和は両オペランドを評価し、if文の論理和は左辺のオペランドがtrueだと右辺のオペランドを評価しないのでしたね、忘れていました。
そして-1がtrueであることも...
流石に論理和の処理がコンパイラによって変わることはないと思いますが、変わるんですかね?
ともかく、回答ありがとうございましたm(__)m
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
お探しの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ランキング
-
プログラミングが分かりません。
-
C言語で自作ヘッダーを作ったの...
-
プログラムがエラーが出る原因
-
分割コンパイルの手順と方法に...
-
コマンドライン引数について。
-
C言語初心者です。計算がうまく...
-
以下の問題のプログラムを教え...
-
SPI 非言語の問題です
-
クレーンでのCFブレーキとな...
-
spi 非言語
-
物理の波についてです 時刻12/8...
-
互いに素と負の数
-
自動制御で言う【遅れ】とは。
-
入力容量(Input Capacitance)...
-
定常応答 と 強制応答 は同...
-
数学:図形問題について 先日、...
-
パターン効果/裾引き(アイパタ...
-
PWM波形をAM波形に変換す...
-
一次遅れ系の制御における時定...
-
オシロスコープのDCとAC
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングが分かりません。
-
C言語のエラーについて
-
'printf':識別子が見つかりませ...
-
3×3のラテン方陣をつくるプログ...
-
プログラムがエラーが出る原因
-
TCP/IP: 非ソケットに対するソ...
-
Expression: nptr != NULL
-
加減剰余のオーバーフローについて
-
getch / putch用のヘッダ
-
コマンドライン引数について。
-
C言語のソースコードについて教...
-
C言語初心者です。計算がうまく...
-
C言語 コンパイルエラー(文字...
-
C言語 遺伝的アルゴリズムでの...
-
C言語で自作ヘッダーを作ったの...
-
リターンキー又は、スペースキ...
-
以下の問題のプログラムを教え...
-
c言語入門
-
C/C++ return文で関数の返却値...
-
c言語プログラミングで初項を1....
おすすめ情報