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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

2014閲覧

Cの==演算子が真の時に1以外を返す場合があるのか?

raccy

総合スコア21735

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

3グッド

4クリップ

投稿2018/01/01 02:23

編集2018/01/01 02:29

C11ドラフトn1570の6.5.9 Equlity operators 3 (p.96)には次のように記載されています。

Each of the operators yields 1 if the specified relation is true and 0 if it is false
それぞれのオペレーターは、指定した関係が真の場合は 1 を、偽の場合は 0 を返す。

C11に準拠していれば、==演算子が真の場合、必ず1になります。では、C99以前や標準に準拠しないコンパイラではどうなのかがわかりません。真の場合に1ではない数値を返す環境があるのか、それとも無いのか、あるとしたらどのような環境(Cのバージョンやコンパイラ、オプションなど)なのかを教えてください。

無い事を証明する場合は悪魔の証明になるので、

  • K&R初版やANSI Cなどがどうであったか?
  • GCC、Clang、Visual C++、BCC32C(Embarcadero C++ Compiler)、Intel C++ Compiler、Oracle Solaris Studio Compiler、Tiny C Compilerなど現在も入手し、最新の環境でも実行でき、組み込みなど特定アーキテクチャ向けでは無い汎用のメジャーなコンパイラでどうなのか?(たりなければ、ご指摘下さい)

でも結構です。ただ、とある組み込み系のコンパイラでは違うという情報があれば、それはそれで回答していただくと助かります。

【注意事項】
この質問はCについてのみです。C++ですと==演算子をオーバーロードできるので、いくらでも例外が作れてしまいます。ただ、C++でもSTLに含まれる標準関数やboostで定義されたクラスではどうなっているのかという情報があれば、別途回答していただくと嬉しいです。

umyu, dodox86, maisumakun👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

K&Rで1だったので、それ以降も1でしょう。JISX3010のCでも1です。

投稿2018/01/01 03:20

otn

総合スコア84487

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

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

raccy

2018/01/01 03:44

K&Rは初版ですか?初版はもっていなくて私にはわからないのです。
otn

2018/01/01 03:49

日本語の書籍の「プログラミング言語C」のことですか?出たときに買いました。 古い処理系としては、使ったことある範囲で言うと、CP/M-80の各種C、Unix SystemIIIのCでも1でしたね。
raccy

2018/01/01 03:53

第2版はでかでかと「第2版」「ANSI規格準拠」と書いてあるので、書いてなければ初版のハズです。 古い処理系の情報もありがとうございます。とても参考になります。
guest

0

直接の回答ではありませんが最初期の C コンパイラのソースが公開されています。
legacy-cc

投稿2018/01/01 03:17

編集2018/01/01 03:29
Zuishin

総合スコア28660

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

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

raccy

2018/01/01 03:43

ソースを見ながら検索していたら`==`部分を解説しているサイトを見つけました。 http://shinh.hatenablog.com/entry/2015/06/04/210238 上記によると最終的には`cmp`命令の結果っぽいですけど、当時のCPUのアセンブリの情報がなく、よくわらないです。追加の情報はありませんか?
Zuishin

2018/01/01 04:22

私自身ソースを詳しく読んだ訳ではないのですが、紹介されたページを見ると最終的に真なら仮想レジスタ R が 1 に偽なら 0 になるように読めました。cmp はフラグを立てる命令ですので次にジャンプなどフラグを使った演算が必要です。そのフラグによってレジスタの値を決めて評価としているのだと思います。
raccy

2018/01/01 04:35

なるほど、となると、このCコンパイラでは必ず1を返していたって事で良いのでしょうか?
Zuishin

2018/01/01 04:43

私はそう思います。 しかしこれはあくまで == の場合だけで、例えば IsDigit は真の値として 1 を返すとは限らないので真の定義は 1 ではなくあくまで非ゼロだと言うことを徹底していかなければならないのではないかと思います。 もちろんギリギリのチューニングが必要な時には == の真が 1 であることを利用する方法もあると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問