ゼロ以外のものはすべてtrueを意味しますが、、、などの>
演算子がtrueを返すので<
、これらの演算子が。より大きい値になる可能性がある注目すべきCコンパイラがあるかどうか知りたいです。==
1
1
言い換えれば、int i = (a==b)
;のコンパイラはありますか。i
ブール値としてではなく整数として使用することを意図し、それが0
または1
?のいずれかであると想定した場合、未定義の動作が発生します。
ゼロ以外のものはすべてtrueを意味しますが、、、などの>
演算子がtrueを返すので<
、これらの演算子が。より大きい値になる可能性がある注目すべきCコンパイラがあるかどうか知りたいです。==
1
1
言い換えれば、int i = (a==b)
;のコンパイラはありますか。i
ブール値としてではなく整数として使用することを意図し、それが0
または1
?のいずれかであると想定した場合、未定義の動作が発生します。
いいえ、存在する場合、それらはCコンパイラではありません:-)標準では、関係演算子と等式演算子はtrueの場合は1、falseの場合は0を返すことが義務付けられています。
積分値をCによるブール値として解釈するための規則0
は、falseであり、他の値はtrueであると述べています。を扱うC11セクションを参照してください。if/while/do/for
これらはすべて、のような言語を含んでいます"while the expression compares unequal to zero"
。具体的には:
6.8.4.1/2: In both forms [of the if statement, one with and one without an else clause], the first substatement is executed if the expression compares unequal to 0. In the else form, the second substatement is executed if the expression compares equal to 0.
6.8.5/4: An iteration statement [while, do and for] causes a statement called the loop body to be executed repeatedly until the controlling expression compares equal to 0.
ただし、比較タイプの式でどのような結果が得られるかは非常に明確0
です1
。これらに関連するC11標準のビットはすべて以下の6.5 Expressions
とおりです。
6.5.8/6: Each of the operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false.
6.5.9/3: The == (equal to) and != (not equal to) operators are analogous to the relational operators except for their lower precedence. Each of the operators yields 1 if the specified relation is true and 0 if it is false.
6.5.13/3: The && operator shall yield 1 if both of its operands compare unequal to 0; otherwise, it yields 0.
6.5.14/3: The || operator shall yield 1 if either of its operands compare unequal to 0; otherwise, it yields 0.
6.5.3.3/5: The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0.
そして、この動作はC99およびC89(ANSI日)にまでさかのぼります。関係演算子と等式演算子を扱うC99セクションでも、戻り値は0または1のいずれかであると記載されています。
また、C89ドラフトでは、等式演算子の戻り値を明示的に指定していませんが、次のように述べています。
==(等しい)および!=(等しくない)演算子は、優先順位が低いことを除いて、関係演算子に類似しています。
そして、関係演算子のセクションは次のように述べています。
演算子<(より小さい)、>(より大きい)、<=(以下)、および> =(以上)のそれぞれは、指定された関係が真の場合は1、真の場合は0を生成します。 false。
参照:C89規格のコピーが浮かんでいないので、 http: //flash-gordon.me.uk/ansi.c.txt 。付録AのリファレンスマニュアルのセクションA7.9とA7.10に、基本的に同じことを述べているK&Rの第2版(1988年のANSI版)があります。初版からの決定的な答えが必要な場合、それは古いがらくたを捨てる傾向が少ない妻を持つ誰かから来なければならないでしょう。
補遺:
結婚していないか、古い本を保管するという点で私よりも親切な妻がいるマイケル・バーによると:-)
K&R 1st Edition(1978)も、7.6と7.7で同じことを述べています。「[関係演算子]はすべて、指定された関係が偽の場合は0、真の場合は1を返します。」...「[等式演算子]は、優先順位が低いことを除けば、関係演算子とまったく同じです。」
0
彼らはまたはを返すことが保証されてい1
ます。
参照:
C99標準:6.5.9等式演算子
パラ3:
==(等しい)および!=(等しくない)演算子は、優先順位が低いことを除いて、関係演算子に類似しています108)。各演算子は、指定された関係がtrueの場合は1、falseの場合は0になります。結果の型はintです。オペランドの任意のペアについて、関係の1つだけが真です。
ここの人々は質問に答えていないと思います。質問は、標準が何を言っているかについてではなく、その点で標準に従わない注目すべきコンパイラがそこにあるかどうかについてでした。
いいえ、私が知る限り、ありません。
私はC標準にアクセスできませんが、ウィキペディアによると:
Cは整数型を使用します。ここで、i> jのような関係式と、&&および||で接続された論理式 は、trueの場合は値1、falseの場合は0になるように定義されていますが、if、while、forなどのテスト部分は、ゼロ以外の値をtrueとして扱います。
ウィキペディアには幸運にも正しい引用がありますが、それらは本への参照であるため、それがどれほどの助けになるかはわかりません:)。
私が見つけることができる限り、これはC99標準の6.5.9段落3からです
==(等しい)および!=(等しくない)演算子は、優先順位が低いことを除いて、関係演算子に類似しています108)。各演算子は、指定された関係がtrueの場合は1、falseの場合は0になります。結果の型はintです。オペランドの任意のペアについて、関係の1つだけが真です。
したがって、評価値は1または0のいずれかである必要があるようです。
仕様により、C言語と見なされるには、条件演算子はfalseの場合は0を、trueの場合は1を返す必要があります。
俳句形式:
Specification
Disallows this behavior,
Otherwise not C.
c89 / c90 / ANSI-Cより前は、比較演算子は「false」条件でゼロ値を生成し、それ以外の場合はゼロに等しくないことが保証されていました。c89によって導入された真の「標準化」の代替1はめったに必要とされず、必要な場合はを使用できますa = (b==c) ? 1 : 0;
。