2016-11-09 9 views
0

私はCコードが新しく、キャストを行っているCの行の結果を解釈しようとしています。これはCコードで達成したキャストです

ASS_CODEは最大4文字の文字列で、数値でもなくてもかまいません。ASCII_ZEROは48として定義された定数で、ASCII_ONEは49として定義された定数です。これはどちらかが強制的に文字列は「0'or 『の場合ASS_CODEが数値またはその他または代わりのテストであるかどうかに基づいて、真または偽の結果の並べ替え1』が、

if ((int)(*ASS_CODE) == ASCII_ZERO) 
     { 
     calc_SDIS_EL13(); 
     } 
     else if ((int)(*ASS_CODE) == ASCII_ONE) 
     { 
     do_gn11(); 
     } else 
      { 
       ........ 
      } 
     } 
+0

もう少しコンテキストが役立ちます。キャストは文字列から整数への変換を行いません。 –

+2

それ以上の文脈がなければ、確かに何かを言うのは難しいですが、キャスティングが本当に必要ないと私には思われます。 –

+0

あなたが言っていることから、このコードは 'if(ASS_CODE [0] == ASCII_ZERO)'とまったく同じです。なぜ誰かがそれらのキャストを追加した理由は誰でも推測できます。 – nos

答えて

0
char ASS_CODE[4] = { ... }; 
#define ASCII_ZERO 48 

if ((int)(*ASS_CODE) == ASCII_ZERO) 

全くわからないどうやら、これがためのコードですASCII以外の実行文字セット、または非常に慎重な開発者が必要です。そうでなければ、ASCII_ZERO定数は必要ありません。

私の最初の考えは、タイプcharがそのプラットフォームでunsigned charに等しく、コンパイラ警告を抑制するためにキャストが必要であったということでした。しかし、定数をどのように定義しても、GCCは警告を省略しません。私はこれを試しました:

enum { ASCII_ZERO = 48 }; 

void x() { 
    char ASS_CODE[4] = {0}; 
    if (ASS_CODE[0] == ASCII_ZERO) {} else {} 
} 

次の考えは、コードがMISRAのような業界標準に準拠している必要があるということです。この規格では、すべてのバイナリ演算子の左辺と右辺が同じ型でなければならないことがあります。そして、48はタイプintを持っているので、文字はそのタイプに正確にキャストされなければなりません。

+1

あなたの最初の部分は、 'a == b'で' a'が符号なしの文字で、 'b'がintであるため、' a'はint型に昇格します(int型が広いあなたのプラットフォーム上にあるunsigned charよりも)。 – nos

0

私はいくつかのキャスティングを行っているCの行の結果を解釈しようとしています。

[...] ASS_CODEは、ASCII_ZEROは48

として定義定数または数値であってもなくてもよい最大4文字のAA文字列です[...]

if ((int)(*ASS_CODE) == ASCII_ZERO) 

ASS_CODE場合char *を入力するか、いくつかのnためchar[n]を入力した後、*ASSCODEchar型を持つ、とASS_CODE[0]と同じものであると評価 - すなわち、文字列の最初の文字。文字列ASCII_ZEROが展開されるリテラル48は、タイプintの値を表します。具体的には、ASCII互換の文字エンコードでは'0'文字の値です。

キャスト演算子は、条件を評価するように、(char)を*ASS_CODEの値を==演算子よりも高い優先順位を有する第intを型に変換した後、右側のオペランド(既にint)と比較されます。 ASS_CODEの最初の文字が数字'0'(ASCII互換のエンコーディングを想定)である場合、条件は1(真)と評価されます。文字のリテラル('0')の代わりにASCII_ZEROが使用されていると考えられます。別の文字エンコーディングが使用されている場合でも、のASCIIの意味との比較が望ましいためです。いずれにせよ、それが生み出される効果です。

キャストの理由は、両方のオペランドを同じ型にすることだったと推測します。または、比較がint値で実行されていることを強調することができます。しかし、プログラムのセマンティクスには何の効果もありませんが、==オペランドのオペランドは、演算が評価される前に「通常の算術変換」の対象となります。この場合、左辺オペランドをintに設定する必要があります。 *ASS_CODEのよう

3

char場合には、(これら2つの1は、ほとんどの場合である)intに促進される署名付きchar又はintより狭い符号なしcharあります。 整数定数48のタイプはintであるため、キャスト(int)は不要です。希少なプラットフォームで

*ASS_CODEのようcharは、int/unsignedのように広い符号なしcharです。保留中の比較操作の一部として*ASS_CODEunsignedに昇格されます。 unsignedの整数定数48(これはint)と比較すると、intunsignedを比較する警告が表示されることがあります。この場合のキャストは警告を静かにします。

関連する問題