質問1:優先順位や結合の規則とは、本質的に「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」であり、「演算実行の優先順位」ではありませんよね?
何故そう思ったかというと次の論理式をご覧ください。
a==1 && b==0 || a==1 && b==0
※int a==1,b==0
この論理式がtureになるプロセスとして、
a==1を評価→true
↓
b==0を評価→true
↓
&&は、a==1 && b==0の論理式をtrueと評価
↓
||は、左側の論理式a==1 && b==0がtrueだから、論理式全体がtrueだと判断し、
右側の論理式の評価を行わない。
プロセスとして、こうだと思うんですけど、優先順位として||は&&より低いですよね?
優先順位が「演算実行の優先順位」を意味するならば、右側の論理式のa==1 && b==0を評価してから||の演算をするはずで矛盾します。
よって、優先順位とは本質的に、「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」であり、「演算実行の優先順位ではない」といえる。
質問2:「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」であれば、例えば、上記の論理式の左側を例に挙げていえば、
b==0は&&と||の2つが共有してるが、&&の方が優先順位が高いから、b==0を先に結び付けてる、その意味でも「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」
は正しいですか?
No.3ベストアンサー
- 回答日時:
#1です。
「優先順位が「演算実行の優先順位」を意味するならば、右側の論理式のa==1 && b==0を評価してから||の演算をするはずで矛盾します。」
ここを言っていませんでした。
確かに仰るとおりなら、評価の順番としては矛盾しています。
でも、それなら
「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」
でも同じように矛盾しています。(同じ事を言っているのですから。)
オペランドと先に結びついていませんよね?
式の評価は、「左から右」へ評価するという規則も有るんですよ。
(もちろん逆も有ります。)
&&も||も左から評価する演算子です。
実際の評価順は、
a==1 && b==0 || a==1 && b==0
・a==1を評価「True」
・&&が出てきたので、右も評価
・b==0を評価「True」
・ここで、a==1&&b==1は「True」
・||が出てきた。
・||は左がTrueなら右はFalseでもTrueなので評価は「True」
・後は、より右側の式を見て、優先順位が同じ又は低い演算子が出てこないから終了
(優先順位が高い演算子は、先に演算するべきだけど評価が決まっているから動でも良い。)
みたいな感じなんですよ。判ります?
丁重なご回答ありがとうございます!
>・a==1を評価「True」
・&&が出てきたので、右も評価
・b==0を評価「True」
・ここで、a==1&&b==1は「True」
・||が出てきた。
・||は左がTrueなら右はFalseでもTrueなので評価は「True」
・後は、より右側の式を見て、優先順位が同じ又は低い演算子が出てこないから終了
(優先順位が高い演算子は、先に演算するべきだけど評価が決まっているから動でも良い。)
みたいな感じなんですよ。判ります?
わかります!
要わ、それは仕様だから仕方ないってことですよね!
No.6
- 回答日時:
実際に実験してみては?
----------------------------------------------------------------------
public class Test {
public static boolean a() {
System.out.println("--- a()");
return true;
}
public static boolean b() {
System.out.println("--- b()");
return false;
}
public static boolean c() {
System.out.println("--- c()");
return true;
}
public static boolean d() {
System.out.println("--- d()");
return false;
}
public static void main(String[] args) {
if (a() && b() || c() && d()) {
}
}
}
----------------------------------------------------------------------
実行結果
----------------------------------------------------------------------
--- a()
--- b()
--- c()
--- d()
----------------------------------------------------------------------
No.5
- 回答日時:
>「優先順位の高い演算子ほど、オペランドをより先に結び付けられる」であり、「演算実行の優先順位」ではありませんよね?
それで正しいでしょう。
ちょっと混乱することを書いて見ます。
a==1 && b==0 || a==1 && b==0
これは、|| の左右で2つに分けられます。式全体の値は、左側を評価して真なら真、偽なら右側の値になるということを、まず認識します。
で、左側を評価すると真なので、それで終わり。
さて、|| の演算はいつ実行されたでしょうか?
No.4
- 回答日時:
別の演算子の例を見たら分かってもらえるでしょうか。
*の結合優先順位は+よりも高いので、"a && b || c && d"と同様の構造になっています。a * b + c * d
この式の評価は
aを評価 → bを評価 → a*bの乗算を実行 → cを評価 → dを評価 → c*dの乗算を実行 → 加算を実行
のように行われます。
&&と||の例と同様の構造でありながら評価を行う手順が異なるのは、要は、個々の演算子ごとにルールが異なるから。
&&や||はJavaの演算子の中では特殊な評価をするものなので、「そういう風に仕様で決まっている」と覚えてください。
なぜそういう仕様になっているかと言えば、&&は||では右項を評価するまでもなく演算結果が決まる場合があり、そういう場合には右項の評価を省くことで速度が向上するから。
その仕様にご不満ならば、&&や||も必ず右項を評価するような仕様のプログラミング言語をご自分で作ればいいのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(恋愛相談) 恋人の優先順位 2 2023/06/27 20:01
- その他(悩み相談・人生相談) 僕の家族は、父、母、長男、姉、次男、僕の6人家族です 僕の家族はいつからか、家族内で優先順位が出来ま 3 2022/06/12 04:14
- カップル・彼氏・彼女 彼女よりも友達の方が優先順位が高く、恋愛の優先順位が低いと言われました。そのことをショックに思ってい 4 2023/04/20 23:03
- 世界情勢 防衛費の増額は必要ですか? また、分配優先順位は? 19 2022/12/28 11:13
- Excel(エクセル) Excel 複数列のある文字を優先して1列に表示したいです 2 2022/12/03 12:07
- その他(教育・科学・学問) 優先順位の付け方 2 2022/10/15 10:16
- 英語 prioritize something の訳し方 3 2023/08/26 13:20
- 仕事術・業務効率化 作業をする時に、作業順や優先順位をちゃんと付けれるようになりたいです。 自分は作業したりする時、頭の 3 2023/07/11 03:15
- その他(悩み相談・人生相談) 優先順位がわからない旦那に責任を取らせる方法はありますか? 例 ・子供の行事よりパチンコ優先 ・夫婦 5 2023/02/06 20:03
- 婚活 条件とルックスと性格が良い男性 3 2023/06/16 15:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
split関数で区切り文字がない場合
-
jasper.exceptionとは?
-
「ワークスペースをビルド中」...
-
Javascriptの値をJava(JSP)へ渡...
-
Eclipse(JAVA)のデバッグで他...
-
JAVAにのeclipseに関する質問で...
-
コミット前の更新データをチェ...
-
Cpad for Borland C++Compiler...
-
eclipseで「サーバーで実行」表...
-
ダブルクォートがエスケープで...
-
Javaで年月の取得(YYYYMM形式で)
-
Eclipseでのクラスパス設定につ...
-
コマンドプロンプト実行での文...
-
Makefileの書き方
-
eclipseでスタックサイズを変更...
-
環境変数設定で
-
エクリプスで実行時、最新クラ...
-
Selenium3 Java Eclipse spanタ...
-
Eclipseで自分が書いたコードだ...
-
Eclipse 実行→Javaアプリケー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
split関数で区切り文字がない場合
-
JAVAにのeclipseに関する質問で...
-
Eclipse(JAVA)のデバッグで他...
-
「ワークスペースをビルド中」...
-
Javascriptの値をJava(JSP)へ渡...
-
eclipseでスタックサイズを変更...
-
コミット前の更新データをチェ...
-
Javaで年月の取得(YYYYMM形式で)
-
Eclipseで実行>Javaアプリケー...
-
eclipseのjavaを実行できない
-
jasper.exceptionとは?
-
eclipse実行ができない
-
Eclipse 実行→Javaアプリケー...
-
環境変数設定で
-
バイナリーコードと、ソースコ...
-
javaからVBAを実行する方法を教...
-
Javaについての質問です。 コン...
-
Worksheet_Changeが動かない
-
エクリプスで実行時、最新クラ...
-
Javascriptのパーミッション
おすすめ情報