[C++] Amélioration du langage C++ vers le langage C ④ (l'opérateur ternaire en langage C - ne peut pas être utilisé comme lvalue | l'opérateur ternaire amélioré en langage C++ | l'opérateur ternaire en langage C est utilisé comme lvalue)





1. Opérateur ternaire en langage C



L '«opérateur ternaire» en langage C, également appelé «opérateur conditionnel», équivaut à une version simplifiée de l'instruction if else ;


Syntaxe de l'opérateur ternaire :

condition ? expression1 : expression2

La condition ci-dessus doit être une expression qui renvoie une valeur booléenne, généralement int en langage C ;

  • Si la valeur de condition est différente de zéro, c'est-à-dire vraie, l'expression entière de l'opérateur ternaire renvoie la valeur de expression1 ;
  • Si la valeur de condition est zéro, c'est-à-dire false, l'expression entière de l'opérateur ternaire renvoie la valeur de expression2 ;

Exemple de code :

#include <stdio.h>

int main() {
    
      
    int a = 10;  
    int b = 20;  
	
	// 使用三目运算符获取 a 和 b 中的最大值 
    int max = (a > b) ? a : b;  
  
    printf("Maximum value : %d\n", max);  
  
    return 0;  
}

Résultats du :
insérez la description de l'image ici


Ce qui précède est l'utilisation normale de l'opérateur ternaire pour le calcul ;





2. L'opérateur ternaire en langage C ne peut pas être utilisé comme lvalue



En langage C, le résultat de l'expression est placé dans le registre, donc le résultat de l'expression est une valeur spécifique, et la valeur peut seulement être lue, pas écrite ;

Dans le code ci-dessus, le résultat de l'expression de l'opérateur ternaire (a > b) ? a : best un nombre, pas une variable,

Par conséquent, les expressions d'opérateurs ternaires en C ne peuvent pas être utilisées comme lvalues ​​;


Dans le code suivant, toute tentative d'attribution d'une valeur à l'expression de l'opérateur ternaire entraîne une erreur ;

Exemple de code :

#include <stdio.h>

int main() {
    
      
    int a = 10;  
    int b = 20;  
	
	// 尝试 为 三目运算符 表达式赋值
    (a > b) ? a : b = 30;   
  
    return 0;  
}

Résultats du :

C:\Users\octop\Desktop>gcc hello.c
hello.c: In function 'main':
hello.c:8:21: error: lvalue required as left operand of assignment
     (a > b) ? a : b = 30;
                     ^

C:\Users\octop\Desktop>

insérez la description de l'image ici





Troisièmement, l'amélioration de l'opérateur ternaire en langage C++



Dans le langage C++, l'expression de l'opérateur ternaire est enrichie,

En C++, l'expression de l'opérateur ternaire renvoie une expression, pas la valeur réelle, mais l'expression elle-même ;

En C++, l'opérateur ternaire peut être utilisé comme une lvalue, qui consiste à affecter une valeur à l'expression renvoyée ;


Syntaxe de l'opérateur ternaire :

condition ? expression1 : expression2

La condition ci-dessus doit être une expression renvoyant une valeur booléenne ;

  • Si la valeur de condition est vraie, l'expression entière de l'opérateur ternaire renvoie expression1 ;
  • Si la valeur de condition est false, l'ensemble de l'expression de l'opérateur ternaire renvoie expression2 ;

Notez que le langage C renvoie directement la valeur de l'expression et que le langage C++ renvoie une expression sans évaluation ;


L'opérateur ternaire en C++ renvoie une adresse d'espace mémoire, qui est le premier pointeur d'adresse mémoire de la variable d'expression ;

La valeur de retour de l'opérateur ternaire en C++ peut être utilisée comme lvalue ou rvalue ;


Exemple de code :

// 导入标准 io 流头文件
// 其中定义了 std 命名空间
//#include <iostream>
// 导入 std 命名空间
//using namespace std;

#include <stdio.h>

int main() {
    
    
    int a = 10;
    int b = 20;

    // 使用三目运算符获取 a 和 b 中的最大值 
    // 并且为 最大值变量 再次赋值 为 30
    int max = (a > b) ? a : b = 30;

    printf("Maximum value : %d\n", max);
    printf("a = %d , b = %d\n", a, b);


    return 0;
}

Résultats du :

Maximum value : 30
a = 10 , b = 30

insérez la description de l'image ici





Quatrièmement, l'opérateur ternaire en langage C est utilisé comme lvalue



L'opérateur ternaire en langage C renvoie la valeur une fois le calcul terminé, de sorte que la valeur de retour ne peut pas être utilisée comme lvalue et ne peut pas être affectée ;

La variable d'événement elle-même renvoyée par l'opérateur ternaire dans le langage C++ est essentiellement la première adresse, qui peut être affectée, et peut être utilisée comme une lvalue ou une rvalue ;

Il existe un cas particulier : si l'opérateur ternaire renvoie une valeur constante, la valeur de retour en C++ ne peut pas être utilisée comme lvalue et une erreur sera signalée ;


Une expression peut être utilisée comme une lvalue, alors l'expression doit avoir de l'espace mémoire, si l'opérateur ternaire renvoie une adresse, alors en langage C, vous pouvez utiliser un pointeur pour attribuer une valeur à l'adresse, et il peut être utilisé comme un lvalue ;

Dans le code suivant, laissez l'opérateur ternaire renvoyer l'adresse de la variable, puis utilisez le pointeur pour affecter une valeur à l'adresse afin d'obtenir l'effet de l'opérateur ternaire en C++. Le compilateur C++ implémente les opérations suivantes, renvoyez l'adresse puis attribuez une valeur à l'adresse ;


Exemple de code :

#include <stdio.h>

int main() {
    
      
    int a = 10;  
    int b = 20;  
	
	// 尝试 为 三目运算符 表达式赋值
	// 该行代码直接报错
    //(a > b) ? a : b = 30;

    // 使用三目运算符获取 a 和 b 中的最大值 
    // 并且为 最大值变量 再次赋值 为 30
	// 令 三目运算符 返回 变量的地址
	// 然后使用 指针 为该地址赋值
	// 即可实现 C++ 中三目运算符的效果
	// C++ 编译器 就是实现的如下操作 , 返回地址 然后为 地址赋值
    int max = *((a > b) ? &a : &b) = 30;

    printf("Maximum value : %d\n", max);
    printf("a = %d , b = %d\n", a, b);	
  
    return 0;  
}

Résultats du :

C:\Users\octop\Desktop>gcc hello.c

C:\Users\octop\Desktop>a.exe
Maximum value : 30
a = 10 , b = 30

C:\Users\octop\Desktop>

insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/han1202012/article/details/132384635
conseillé
Classement