Recherche…


Introduction

Traditionnellement, un littéral est une expression désignant une constante dont le type et la valeur sont évidents. Par exemple, 42 est un littéral, tandis que x n'est pas puisque l'on doit voir sa déclaration pour connaître son type et lire les lignes de code précédentes pour connaître sa valeur.

Cependant, C ++ 11 a également ajouté des littéraux définis par l'utilisateur , qui ne sont pas des littéraux au sens traditionnel mais peuvent être utilisés comme raccourci pour les appels de fonctions.

vrai

Un mot-clé désignant l'une des deux valeurs possibles du type bool .

bool ok = true;
if (!f()) {
    ok = false;
    goto end;
}

faux

Un mot-clé désignant l'une des deux valeurs possibles du type bool .

bool ok = true;
if (!f()) {
    ok = false;
    goto end;
}

nullptr

C ++ 11

Un mot clé indiquant une constante de pointeur nul. Il peut être converti en n'importe quel type de pointeur ou de pointeur sur membre, produisant un pointeur nul du type résultant.

Widget* p = new Widget();
delete p;
p = nullptr; // set the pointer to null after deletion

Notez que nullptr n'est pas lui-même un pointeur. Le type de nullptr est un type fondamental appelé std::nullptr_t .

void f(int* p);

template <class T>
void g(T* p);

void h(std::nullptr_t p);

int main() {
    f(nullptr); // ok
    g(nullptr); // error
    h(nullptr); // ok
}

ce

Dans une fonction membre d'une classe, le mot this clé this est un pointeur sur l'instance de la classe sur laquelle la fonction a été appelée. this ne peut pas être utilisé dans une fonction membre statique.

struct S {
    int x;
    S& operator=(const S& other) {
        x = other.x;
        // return a reference to the object being assigned to
        return *this;
    }
};

Le type de this dépend de la qualification cv de la fonction membre: si X::f est const , alors le type de this dans f est const X* , donc this ne peut pas être utilisé pour modifier des données non statiques Fonction membre const . De même, this hérite de la qualification volatile de la fonction dans laquelle elle apparaît.

C ++ 11

this peut également être utilisé dans un initialiseur d' accolade ou d'égale pour un membre de données non statique.

struct S;
struct T {
    T(const S* s);
    // ...
};
struct S {
    // ...
    T t{this};
};

this une valeur, donc il ne peut pas être assigné à.

Littéral entier

Un littéral entier est une expression primaire de la forme

  • littéral décimal

C'est un chiffre décimal non nul (1, 2, 3, 4, 5, 6, 7, 8, 9), suivi de zéro ou plusieurs chiffres décimaux (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

int d = 42;

  • littéral octal

C'est le chiffre zéro (0) suivi de zéro ou plusieurs chiffres octaux (0, 1, 2, 3, 4, 5, 6, 7)

int o = 052

  • hex-littéral

C'est la séquence de caractères 0x ou la séquence de caractères 0X suivie d'un ou plusieurs chiffres hexadécimaux (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C , d, D, e, E, f, F)

int x = 0x2a; int X = 0X2A;

  • littéral binaire (depuis C ++ 14)

C'est la séquence de caractères 0b ou la séquence de caractères 0B suivie d'un ou plusieurs chiffres binaires (0, 1)

int b = 0b101010; // C++14

Le suffixe d'entier, s'il est fourni, peut contenir l'un des deux ou les deux suivants (si les deux sont fournis, ils peuvent apparaître dans n'importe quel ordre:

  • unsigned-suffix (le caractère u ou le caractère U)

unsigned int u_1 = 42u;

  • suffixe long (le caractère l ou le caractère L) ou le long suffixe long (la séquence de caractères ll ou la séquence de caractères LL) (depuis C ++ 11)

Les variables suivantes sont également initialisées à la même valeur:

unsigned long long l1 = 18446744073709550592ull; // C++11
unsigned long long l2 = 18'446'744'073'709'550'592llu; // C++14
unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C++14
unsigned long long l4 = 184467'440737'0'95505'92LLU; // C++14

Remarques

Les lettres dans les littéraux entiers sont insensibles à la casse: 0xDeAdBaBeU et 0XdeadBABEu représentent le même nombre (une exception est le suffixe long-long, qui est soit ll ou LL, jamais lL ou Ll)

Il n'y a pas de littéral entier négatif. Des expressions telles que -1 appliquent l'opérateur unaire moins à la valeur représentée par le littéral, ce qui peut impliquer des conversions de types implicites.

Dans C avant C99 (mais pas dans C ++), les valeurs décimales non mappées qui ne rentrent pas dans long int peuvent avoir le type unsigned long int.

Lorsqu'elles sont utilisées dans une expression de contrôle de #if ou #elif, toutes les constantes entières signées agissent comme si elles avaient le type std :: intmax_t et toutes les constantes entières non signées agissent comme si elles avaient le type std :: uintmax_t.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow