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

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

ただいまの
回答率

91.04%

  • C

    2964questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 4
  • VIEW 443

raccy

score 15182

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で定義されたクラスではどうなっているのかという情報があれば、別途回答していただくと嬉しいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/01 12:44

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

    キャンセル

  • 2018/01/01 12:49

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

    キャンセル

  • 2018/01/01 12:53

    第2版はでかでかと「第2版」「ANSI規格準拠」と書いてあるので、書いてなければ初版のハズです。

    古い処理系の情報もありがとうございます。とても参考になります。

    キャンセル

+1

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/01 12:43

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

    キャンセル

  • 2018/01/01 13:22

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

    キャンセル

  • 2018/01/01 13:35

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

    キャンセル

  • 2018/01/01 13:43

    私はそう思います。
    しかしこれはあくまで == の場合だけで、例えば IsDigit は真の値として 1 を返すとは限らないので真の定義は 1 ではなくあくまで非ゼロだと言うことを徹底していかなければならないのではないかと思います。

    もちろんギリギリのチューニングが必要な時には == の真が 1 であることを利用する方法もあると思います。

    キャンセル

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

  • ただいまの回答率 91.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    2964questions

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