比較

2016-03-23 29 views
1

申し訳ありません。 私はちょうどこのように、変数の比較の結果を割り当てたい:コンパイルする場合比較

int a = 3, b = 2; // In actual code they're not integer literals 
int result = a > b; 

、(-Wall付き)gccは文句はありません、とアセンブリ出力を見て、私はそれがcmpに翻訳されますましたsetle(またはsetgなど)。私はそれが使用されていないことがわかっているので、無効なコード(C)か悪い習慣かを考えています。

+0

それだ有効な..... – Maroun

+0

'実際のコードでは、彼らは元のコードであるかliterals'整数じゃありませんか? –

+1

'> 'などの演算子は、int、' 0'または '1'を評価します。 –

答えて

3

これは完全に有効なCコードです。動作はC99規格のセクション6.5.8.6に詳述されている:

オペレータ<(未満)、>(より大きい)、より<=、(より小さいか等しい)と>=(以上の各または等しい場合)は、指定されたリレーションがtrueの場合は1、falseの場合は0となります。結果はタイプintです。

あなたは事前C99コンパイラとの互換性が必要レガシーコードを維持している場合を除き、代わりにintconsider using <stdbool.h> and bool type。何@dasblinkenlight

-3

は権利であると述べました。それに加えて、私はあなたのコードを知らないので、コンパイラの最適化を避けるために変数 "result"をvolatileとして定義する必要があります.2と3は魔法の値であり、すでに比較の結果がわかっています。 ので、交換してみてください。

volatile int result = a > b; 

int result = a > b; 

は、揮発性の使用方法については、こちらをご覧ください。

+0

なぜ最適化を避けたいですか –

+0

なぜ「volatile」が関係すると思われますか? 'result'に代入される値は、代入が実行されたときの比較の値になります。 'a'または' b'(あるいはその両方)がその後変更されても、 'volatile'とマークされているかどうかにかかわらず、' result'の値は変更されません。あなたの '揮発性の使用法についてもっと読む'という行はリンクではありませんが、コンテンツにはリンクがあるはずです。 –

+0

この変数が後で使用される場合。もはやちょうど使用法をそれに割り当てることはありません。これは最適化されます。 –