web-dev-qa-db-fra.com

Que signifie \ x en c / c ++?

char arr[]= "\xeb\x2a";

BTW, sont-ils les mêmes:

"\xeb\x2a" contre '\xeb\x2a'

38
user198729

\x indique un caractère d'échappement hexadécimal. Il est utilisé pour spécifier des caractères qui ne peuvent pas être saisis (comme un _ '\x00').

Et "\xeb\x2a" est une chaîne littérale (le type est char *, 3 octets, terminé par un caractère nul) et '\xeb\x2a' est une constante de caractère (le type est int, 2 octets, sans terminaison nulle, et n'est qu'une autre façon d'écrire 0xEB2A ou 60202 ou 0165452). Pas le même :)

32
Seth

Comme d'autres l'ont dit, le \x est une séquence d'échappement qui démarre une "séquence d'échappement hexadécimale".

Quelques détails supplémentaires de la norme C99:

Lorsqu'il est utilisé à l'intérieur d'un ensemble de guillemets simples (') les caractères font partie d'une "constante de caractère entier" qui est (6.4.4.4/2 "Constantes de caractère"):

une séquence d'un ou plusieurs caractères multi-octets entre guillemets simples, comme dans 'x'.

et

Une constante de caractère entier a le type int. La valeur d'une constante de caractère entier contenant un seul caractère mappé à un caractère d'exécution à un octet est la valeur numérique de la représentation du caractère mappé interprétée comme un entier. La valeur d'une constante de caractère entier contenant plusieurs caractères (par exemple, 'ab'), ou contenant un caractère ou une séquence d'échappement qui ne correspond pas à un caractère d'exécution à un octet, est défini par l'implémentation.

Ainsi, la séquence dans votre exemple de '\xeb\x2a' est une valeur définie par l'implémentation. Il s'agit probablement de la valeur int 0xeb2a ou 0x2aeb selon que la plate-forme cible est big-endian ou little-endian, mais vous devrez consulter la documentation de votre compilateur pour en être certain.

Lorsqu'il est utilisé dans un ensemble de guillemets doubles (") les caractères spécifiés par la séquence d'échappement hex font partie d'un littéral de chaîne terminé par null.

De la norme C99 6.4.5/3 "Littéraux de chaîne":

Les mêmes considérations s'appliquent à chaque élément de la séquence dans un littéral de chaîne de caractères ou un littéral de chaîne large comme s'il était dans une constante de caractère entier ou une constante de caractère large, sauf que le guillemet simple ' est représentable soit par lui-même, soit par la séquence d'échappement \', mais le guillemet double " doit être représenté par la séquence d'échappement \".


Information additionnelle:

À mon avis, vous devriez éviter d'éviter d'utiliser des constantes "multi-caractères". Il n'y a que quelques situations où elles fournissent une valeur par rapport à l'utilisation d'une constante int régulière et ancienne. Par exemple, '\xeb\x2a' pourrait être plus facilement spécifié comme 0xeb2a ou 0x2aeb selon la valeur que vous vouliez vraiment.

Un domaine que j'ai trouvé utile pour les constantes multi-caractères est de trouver des valeurs d'énumération intelligentes qui peuvent être reconnues dans un débogueur ou un vidage de mémoire:

enum CommandId {
    CMD_ID_READ  = 'read',
    CMD_ID_WRITE = 'writ',
    CMD_ID_DEL   = 'del ',
    CMD_ID_FOO   = 'foo '
};

Il y a peu de problèmes de portabilité avec ce qui précède (à l'exception des plates-formes qui ont de petits chiffres ou des avertissements qui pourraient être vomis). Que les caractères se retrouvent dans les valeurs d'énumération sous forme de petit ou de gros-boutiste, le code fonctionnera toujours (à moins que vous ne fassiez quelque chose d'impie avec les valeurs d'énumération). Si les caractères finissent dans la valeur en utilisant une endianité qui n'était pas ce à quoi vous vous attendiez, cela pourrait rendre les valeurs moins faciles à lire dans un débogueur, mais la "correction" n'est pas affectée.

10
Michael Burr

Quand tu dis:

BTW, sont-ils les mêmes:

"\ xeb\x2a" vs '\ xeb\x2a'

Ils ne le sont en fait pas. Le premier crée un littéral de chaîne de caractères, terminé par un octet zéro, contenant les deux caractères dont la représentation hexadécimale est fournie. Le second crée une constante entière.

2
anon

C'est un caractère spécial qui indique que la chaîne est en fait un nombre hexadécimal.

http://www.austincc.edu/rickster/COSC1320/handouts/escchar.htm

1
badcodenotreat

Vous auriez pu le googler. Site Web utile ici .

Et je cite:

x Entier hexadécimal non signé

De cette façon, votre \xeb est égal à 235 en décimales.

1
SeargX

Le \x signifie qu'il s'agit d'un caractère d'échappement hexadécimal. Donc \xeb signifierait le caractère eb en hexadécimal ou 235 en décimal. Voir http://msdn.Microsoft.com/en-us/library/6aw8xdf2.aspx pour des informations sur le minerai.

Quant au second, non, ce n'est pas pareil. Les guillemets doubles, ", signifie que c'est une chaîne de caractères, un tableau de caractères terminé par un caractère nul, tandis qu'un guillemet simple, ', signifie qu'il s'agit d'un seul caractère, l'octet que ce caractère représente.

1
Tarka

\ x vous permet de spécifier le caractère par son code hexadécimal.

Cela vous permet de spécifier des caractères qui ne sont normalement pas imprimables (dont certains ont des séquences d'échappement spéciales prédéfinies telles que '\ n' = nouvelle ligne et '\ t' = tab '\ b' = bell)

1
Loopo