285 votes

Que font les apostrophes en C++ lorsqu’il est utilisé sur plusieurs caractères ?

Je suis curieux de connaître ce code :

me donne une puissance de `` .

Ma question : la sortie n’est une adresse en mémoire ou quelque chose ?

287voto

K-ballo Points 44794

Il s’agit d’un littéral de multi caractère. est , qui se décompose comme

Edit :

C++ standard, §2.14.3/1 - littéraux de caractère

(...) Un littéral de caractère ordinaire qui contient plus d’un c-char est un multicharacter littéral. Un multicharacter littérale a valeur de type int et mise en œuvre-définie.

78voto

chys Points 682

Non, il n’est pas une adresse. C’est le soi-disant Jeux de caractères multioctet.

En général, c’est les valeurs ASCII des quatre caractères combinés.

' t ' == 0x74 ; « e » == 0 x 65 ; de ' == 0x73 ; ' t ' == 0x74 ; 0x74657374 est donc 1952805748.

Mais il peut aussi être 0x74736574 sur un autre compilateur. Les normes C et C++ que la valeur des caractères codés sur plusieurs octets est mise en œuvre défini. Donc, généralement, son utilisation est fortement déconseillée.

18voto

Mouna Cheikhna Points 12741

Un caractère ordinaire littérale qui contient plus d'un c-char est un multicaractère littérale. Un multicaractère littérale est de type int et de mise en valeur définie.

La mise en œuvre définies comportement est nécessaire pour être documentées par la mise en œuvre. par exemple dans gcc, vous pouvez le trouver ici

Le compilateur valeurs multi-caractère caractère constant un caractère à la fois, un décalage de la valeur précédente de gauche par le nombre de bits par caractère cible, puis ou-ing dans la bit-modèle du nouveau caractère tronqué à la largeur d'un caractère cible. La finale peu-motif de type int, et est donc signé, indépendamment du fait que seul les personnages sont signés ou pas.

Vérifiez bien l'explication de cette page pour plus de détails

10voto

bobobobo Points 17477

Ils sont vraiment ints. Ils sont largement utilisés dans le Core Audio API enum par exemple, dans l' CoreAudioTypes.h fichier d'en-tête,

enum
{
    kAudioFormatLinearPCM               = 'lpcm',
    kAudioFormatAC3                     = 'ac-3',
    kAudioFormat60958AC3                = 'cac3',
    kAudioFormatAppleIMA4               = 'ima4',
    kAudioFormatMPEG4AAC                = 'aac ',
    kAudioFormatMPEG4CELP               = 'celp',
} ;

Il y a beaucoup de choses sur ce qui n'est pas "plate-forme indépendante", mais lorsque vous êtes en utilisant une api qui est faite pour une plate-forme spécifique, qui se soucie de la portabilité. La vérification de l'égalité sur la même plate-forme ne manquera jamais. Ces enum'les valeurs de d sont plus faciles à lire et elles en contiennent en fait de leur identité, de leur valeur, ce qui est assez agréable.

Ce que j'ai essayé de le faire ci-dessous est de conclure un caractère multi-octets littérale afin qu'elle puisse être imprimé (sur Mac cela fonctionne). La chose étrange est, si vous n'utilisez pas tous les 4 caractères, le résultat devient faux ci-dessous..

#include <stdio.h>

#define MASK(x,BYTEX) ((x&(0xff<<8*BYTEX))>>(8*BYTEX))

struct Multibyte
{
  union{
    int val ;
    char vals[4];
  };

  Multibyte() : val(0) { }
  Multibyte( int in )
  {
    vals[0] = MASK(in,3);
    vals[1] = MASK(in,2);
    vals[2] = MASK(in,1);
    vals[3] = MASK(in,0);
  }
  char operator[]( int i ) {
    return val >> (3-i)*8 ; // works on mac
    //return val>>i*8 ; // might work on other systems
  }

  void println()
  {
    for( int i = 0 ; i < 4 ; i++ )
      putc( vals[i], stdout ) ;
    puts( "" ) ;
  }
} ;

int main(int argc, const char * argv[])
{
  Multibyte( 'abcd' ).println() ;  
  Multibyte( 'x097' ).println() ;
  Multibyte( '\"\\\'\'' ).println() ;
  Multibyte( '/*|' ).println() ;
  Multibyte( 'd' ).println() ;

  return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X