Les chaînes littérales et les valeurs renvoyées par la fonction sont-elles des lvalues ​​ou des rvalues?

  1. Il suffit de se demander si une chaîne littérale est une lvalue ou une rvalue. Les autres littéraux (comme int, float, char, etc.) sont-ils lvalue ou rvalue?

  2. La valeur de retour d’une fonction est-elle une lvalue ou une rvalue?

Comment faites-vous la différence?

    1. les littéraux de chaîne sont des lvalues, mais vous ne pouvez pas les changer
    2. rvalue, mais s’il s’agit d’un pointeur et non NULL, l’object pointé est une lvalue

    La norme C reconnaît les termes d’origine signifiant gauche et droite comme dans L = R ; Cependant, il est important de penser à lvalue en tant que valeur de localisateur , ce qui signifie que vous pouvez obtenir l’adresse d’un object et que, par conséquent, cet object a un emplacement. (Voir 6.3.2.1 en C99 .)

    De même, la norme a abandonné le terme rvalue et utilise simplement “la valeur d’une expression”, ce qui représente pratiquement tout, y compris les littéraux tels que ints, chars, float, etc. peut aussi être fait avec une lvalue, vous pouvez donc considérer toutes les lvalues ​​comme des rvalues.

    Il existe deux types d’expressions en C: 1. lvalue: une expression qui est une lvalue peut apparaître à gauche ou à droite d’une affectation. 2. rvalue: une expression qui est une rvalue peut apparaître à droite mais pas à gauche d’une affectation. Les variables sont des valeurs et peuvent donc apparaître à gauche d’une affectation. Les littéraux numériques sont des valeurs et ne peuvent donc pas être atsortingbués et ne peuvent pas apparaître à gauche. Voici une déclaration valide: int g = 20; Mais suivre n’est pas une déclaration valide et générerait une erreur de compilation: 10 = 20;

    il existe une définition pour C ++ de Microsoft. Selon cette définition, une chaîne littérale, telle que “hello world”, est lvalue, car elle est constante et non temporaire. En réalité, il persiste tout au long de la vie de votre application.