質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

7回答

5176閲覧

プログラミング言語では何故 A>B>C みたいな書き方ができないのか

windows12

総合スコア3

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

6クリップ

投稿2021/10/03 04:21

編集2021/10/03 04:22

数学では A > B > C で、BはAより小さくてCより大きいと表現することがよくあると思いますが、多くのプログラミング言語では何故 (A>B && B>C) と表現しなければいけないのでしょうか。

うろ覚えで間違っているかもしれませんが、昔読んだC言語の入門本ではプログラムは1つずつしか処理できないみたいに説明されていた気がしますが、A>B>CではコンパイラがA>Bと読んでしまうから文法的に無理ということでしょうか?それとも表現ができない理由は単純にプログラマーがソースコードを読みにくいからでしょうか?

また、そういった表現ができるプログラミング言語は存在しますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/10/03 04:22

Python と C 言語では言語が違うからです。
m.ts10806

2021/10/03 04:33

自分で言語作ってみればわかるのでは。 それ以外は「仕様」と言っても差し支えない話です。
hentaiman

2021/10/03 05:06

> それとも表現ができない理由は単純にプログラマーがソースコードを読みにくいからでしょうか? その言語を作ったプログラマーにとって読みにくいからという可能性はあります
Kenji.Noguchi

2021/10/05 02:42

>も<も二項演算子の一つに過ぎないのだから素直にコンパイラを実装したらA>B>Cは通ってしまうはず。それを敢えて文法エラーにしてる言語が多いのはバグの温床だからでしょう。 実際C言語ではA>B>Cは文法としては正しくエラーになりません。ただ実行結果はおそらく意図した結果ではないでしょう。ABCがintだったとして左からA > Bが評価された時点でboolになり、次に> Cはbool > intの比較になるわけで意図したコードではないのは明らかです。
thkana

2021/10/05 03:55

Cには標準では論理型は無いし、C99でできた_Boolも結局0と1を入れる整数型でしかないし。 > A > Bが評価された時点でboolになり なりません。Cの比較演算子が返すのは0または1のint型(JIS X3010でも参照してください)。 最近 https://teratail.com/questions/361799#reply-492740 でそんな話をした記憶が。 booleanとintの比較を禁止したJavaなんかでは、比較演算がbooleanを返すのでa>b>cはエラーになりますが、それは積極的にa>b>cをエラーにした、というわけではないでしょう。
guest

回答7

0

ベストアンサー

何故 (A>B && B>C) と表現しなければいけないのでしょうか。

言語規則を作った人がそう決めたから。真面目に、それしか言いようがないでしょう。
でもって、あなたがその言語を使うということは、その言語規則に従うことに全面的に同意したということなわけで(同意しないなら他の言語を使え、という話ですけれど)。

何故そういう規則にしたか、考えられる理由としては、文法を(ひいては処理系を)単純にするため。
Cの場合、>というキーワードを、二項演算子として、二つの値から一つの整数を返すものと「決めた」。
そうすると、a>bだろうとa>b>cだろうと特別なことはなく、左から順に処理していけばいいわけで、規則は(そしてその実装は)単純で済みますね。

A>B>CではコンパイラがA>Bと読んでしまうから

卵が先か鶏が先かという話ではありますが、コンパイラの実装を考慮しながら仕様を決めたのでしょう。とはいえ、先にコンパイラができてしまっていて、その動きに合わせて仕様を決めるということはあり得ないです。
Cについて言えば、生まれたのが1970年代。そのころのコンピュータの能力を考えれば、プログラムの読みやすさよりはコンパイラの処理の軽さのほうに重きがおかれた事情も想像できなくはありません。

既に他の回答にありますが、pythonではa<b<cと記述できます。
さて、そのpythonでa<b>cと記述したらどういう判断になるのでしょうね。
a<bであってb>cであることは迷いませんが、ではaとcとの関係は?
どうやら(a<b) and (b>c)と解釈するだけでaとcの関係は見ないみたいですが、
ふと気になってしまうそういうことに悩まなくてよい、というのも2項で割り切った効果といえなくもなさそう。いやまぁ、そういう言語を使うならそれくらい知っておけ、ということではありますけれど。

投稿2021/10/03 06:06

thkana

総合スコア7639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iwakitaira

2021/10/05 00:37

A>B>C こういう論理条件の必要性が頻繁であるのか。 また、これを人間が一度に判断しているか。 やはり言語の複雑化や論理条件処理の適正を判断するからであろう。 ちなみに、 A>B>・・・・>Y>Z を求めることにもなるのではないか。 従って、言語の複雑化を最小限にするためにも、入れないのだろう。
Zuishin

2021/10/05 00:43

> こういう論理条件の必要性が頻繁であるのか。 割と頻繁にあります。 少し文字を書き足すだけで同じことはできるので困りはしませんが。
guest

0

既に解決済みとなっているので蛇足かなと思いますがあえて書きます。
個人的にはこのようなことを疑問に思い調べることは非常に大事なことと
思います。
但し、疑問に思ったことを自分で出来る限り調べてみて、それでも解決しない
疑問がある場合にここのような掲示板で質問するとよりベターだったと思います。

例えばプログラムに1<2<3と書いたらどうなるのページの方は質問者さんと同じ疑問を持ち、
自分で言語別にどのような動作をするのかテストコードを書き、言語によってエラーになる場合は
エラーの原因は何なのかまで調査を行っています。

人間ってその時は理解した気になっても直ぐに忘れてしまう生き物ですが、自分自身で腑に落ちるまで
調査・実行して確認したことは時間が経っても覚えているものです。
ですので、なるべく自分自身で調査・確認することをお勧めします。

投稿2021/10/05 01:07

kaina

総合スコア418

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

また、そういった表現ができるプログラミング言語は存在しますか?

数学にゴリゴリ寄せてるWolfram ゆう言語もできたんやないかな。興味あればここに行って、1 < 2 < 3 とか入力してみたって〜

投稿2021/10/03 08:40

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  • A>B>CではコンパイラがA>Bと読んでしまうから文法的に無理ということでしょうか?

いいえ、Pythonでは書けます。

  • それとも表現ができない理由は単純にプログラマーがソースコードを読みにくいからでしょうか?

いいえ。読みやすさの問題ではありません。

  • 何を問題にしているのでしょう?

数学では数学の表記法を使います。それぞれのプログラミング言語はそれぞれの表記法を使います。
数学で普通に使われていて、プログラミング言語で書けないものはたくさんあります。
2x+1 とか Σk とか、dy/dx などです。

なぜ、A > B > C だけを問題にするのでしょうか。

日本人は漢字とかなを使っているのに、どうして英語を書く場合にローマ文字を使わなければならないのでしょう。
日本人はtunaはマグロのことだと思っているのにどうしてツナ缶にカツオが入っていることがあるのでしょう。
というような疑問を持っても仕方がないのです。

日本語や英語のような自然言語、数学や物理や化学のような学術言語は多くの人が作り出したものですので、その中でも一貫していない部分はいろいろとあります。

一方、プログラミング言語のような人工言語は、その言語の作成者が何らかの理由で文法や意味を決めていきます。古くなっAAた言語では作成者ではなく標準化委員会が文法や意味を決めている場合もあります。

日本語が正しくて、英語や中国語が間違っているといような意見は賛成できませんし、日本語を廃止して日本の国語を英語にしようという意見にも賛成できません。

それと同じように、それぞれのプログラミング言語はそれぞれの文法を持っています。

SmallTalkという言語では、1 + 3 * 5 は 20 でした。PARCの人たちがそう決めたからです。それを批判するのは、カツオをtunaと呼ぶのなぜなのだというのと同じで意味がない質問です。

  • 多くのプログラミング言語では何故 (A>B && B>C) と表現しなければいけないのでしょうか。

それぞれのプログラミング言語の作成者やその後継者がそう決めているからです。
テレビのリモコンのAボタンを押す意味は、そのテレビ番組が決めているのと同じです。

投稿2021/10/03 08:34

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

CPUの都合だと思います。
大抵のCPUは一部の命令以外は2項演算の回路が多いです。

そのため3つ以上だと、コンパイラは命令を「回路に適した命令へ作り直す」必要が出ます。
その実装は面倒だろうと思うので、無いことが多いのでは?と考えます。

投稿2021/10/05 06:06

grara

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

(A>B && B>C)だと二項演算3組としてスタックに積めるけど、A > B > C のままでは積めない。

あとは詳しい人の解説を待つか探すと良いと思います。

投稿2021/10/05 01:10

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/10/05 01:43 編集

二項演算としてスタックに積む方法が唯一の解析方法ではないので、話はスタートに戻ります。 > あとは詳しい人の解説を待つか探すと良いと思います。 回答を途中やめして(つくかどうかもわからない)他の回答に任せるのはさすがに無意味すぎませんか?
guest

0

また、そういった表現ができるプログラミング言語は存在しますか?

python

1$ python 2>>> a = 11 3>>> b = 33 4>>> c = 22 5>>> a < c < b 6True 7>>> a < b < c 8False

追記。

js

1$ node 2> a = 11 3> b = 33 4> c = 22 5 6> a < c < b 7true 8> a < b < c 9true

期待通りの結果ではない。算数の回答としては、むちゃくちゃ。

多くのプログラミング言語では何故 (A>B && B>C) と表現しなければいけないのでしょうか。

そのように書けば想定どおり。

js

1> (a < c) && (c < b) 2true 3> (a < b) && (b < c) 4false

あとはthkanaさんの回答をどうぞ。

投稿2021/10/03 04:30

編集2021/10/03 08:07
shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問