char arr[]= "\xeb\x2a";
ところで、これらは同じです:
"\xeb\x2a"
vs '\xeb\x2a'
\x
は、16進文字エスケープを示します。入力できない文字を指定するために使用されます(null '\x00'
)。
そして"\xeb\x2a"
はリテラル文字列です(タイプはchar *
、3バイト、ヌル終了)、および'\xeb\x2a'
は文字定数です(タイプはint
、2バイトで、nullで終了せず、0xEB2Aまたは60202または0165452を記述する別の方法です)。同じではありません :)
他の人が言ったように、\x
は「16進エスケープシーケンス」を開始するエスケープシーケンスです。
C99標準の詳細:
単一引用符('
)のセット内で使用される場合、文字は(6.4.4.4/2 "文字定数")である「整数文字定数」の一部です。
'x'
のように、単一引用符で囲まれた1つ以上のマルチバイト文字のシーケンス。
そして
整数文字定数の型はintです。シングルバイト実行文字にマップする単一の文字を含む整数文字定数の値は、整数として解釈されるマップされた文字の表現の数値です。複数の文字(たとえば、
'ab'
)を含む整数文字定数の値、またはシングルバイト実行文字にマップされない文字またはエスケープシーケンスを含む整数定数の値は、実装で定義されます。
したがって、'\xeb\x2a'
の例のシーケンスは、実装定義の値です。ターゲットプラットフォームがビッグエンディアンかリトルエンディアンかに応じて、int値0xeb2a
または0x2aeb
になる可能性がありますが、確実に知るにはコンパイラのドキュメントを確認する必要があります。
二重引用符("
)のセット内で使用される場合、hex-escape-sequenceで指定された文字は、ヌル終了文字列リテラルの一部です。
C99標準6.4.5/3の「文字列リテラル」から:
文字列リテラルまたはワイド文字列リテラルのシーケンスの各要素には、整数文字定数またはワイド文字定数の場合と同じ考慮事項が適用されますが、シングルクォート
'
はそれ自体またはエスケープシーケンス\'
によって、二重引用符"
はエスケープシーケンス\"
で表されます。
追加情報:
私の意見では、「複数文字」定数の使用は避けるべきです。通常の古いint
定数を使用して値を提供する状況はわずかです。たとえば、'\xeb\x2a'
は、実際に必要な値に応じて、0xeb2a
または0x2aeb
としてより移植可能に指定できます。
複数文字の定数が有用であることがわかった1つの領域は、デバッガーまたはメモリダンプで認識できる巧妙な列挙値を考え出すことです。
enum CommandId {
CMD_ID_READ = 'read',
CMD_ID_WRITE = 'writ',
CMD_ID_DEL = 'del ',
CMD_ID_FOO = 'foo '
};
上記には移植性の問題はほとんどありません(小さなintや警告が発生する可能性のあるプラットフォーム以外)。文字がリトルエンディアン形式またはビッグエンディアン形式の列挙値で終わるかどうかにかかわらず、コードは引き続き機能します(列挙値で何か他のことを行う場合を除きます)。文字が予期したものではないエンディアンネスを使用して値になった場合、デバッガーで値が読みにくくなる可能性がありますが、「正確さ」には影響しません。
あなたが言う時:
ところで、これらは同じです:
「\ xeb\x2a」と「\ xeb\x2a」
実際にはそうではありません。最初は、ゼロバイトで終了する文字列リテラルを作成します。この文字列リテラルには、指定した16進表現の2文字が含まれます。 2番目は整数定数を作成します。
これは、文字列が実際には16進数であることを示す特殊文字です。
http://www.austincc.edu/rickster/COSC1320/handouts/escchar.htm
\x
は、16進文字エスケープであることを意味します。そう \xeb
は、16進数の文字eb
、または235
10進数。鉱石情報については、 http://msdn.Microsoft.com/en-us/library/6aw8xdf2.aspx を参照してください。
2番目については、いいえ、それらは同じではありません。二重引用符、"
は、文字列、ヌル終了文字配列であることを意味しますが、一重引用符'
は、その文字が表す単一の文字であることを意味します。
\ xを使用すると、16進コードで文字を指定できます。
これにより、通常は印刷できない文字(一部には '\ n' = newlineや '\ t' = tab '\ b' = bellなどの特別なエスケープシーケンスが事前に定義されている)を指定できます。