• 【C++】C++ 语言对 C 语言的加强 ④ ( C 语言中的三目运算符 - 不能作为左值 | C++ 语言中的三目运算符增强 | C 语言中三目运算符作为左值使用 )






    一、C 语言中的三目运算符



    C 语言 中的 " 三目运算符 " , 又称为 " 条件运算符 " , 相当于一个简化版本的 if else 语句 ;


    三目运算符语法 :

    condition ? expression1 : expression2
    
    • 1

    上面的 condition 必须是一个 返回布尔值 的表达式 , C 语言中一般是 int ;

    • 如果 condition 的值为 非零值 , 也就是 true , 则整个 三目运算符 表达式 返回 expression1 的值 ;
    • 如果 condition 的值为 零值 , 也就是 false, 则整个 三目运算符 表达式 返回 expression2 的值 ;

    代码示例 :

    #include 
    
    int main() {  
        int a = 10;  
        int b = 20;  
    	
    	// 使用三目运算符获取 a 和 b 中的最大值 
        int max = (a > b) ? a : b;  
      
        printf("Maximum value : %d\n", max);  
      
        return 0;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    执行结果 :
    在这里插入图片描述


    上面是正常使用 三目运算符 进行计算 ;





    二、C 语言中 三目运算符 不能作为左值



    C 语言中 , 表达式的结果 是 放在 寄存器 中的 , 因此 表达式 的结果 是一个具体的值 , 值 只能读取 , 不能写入 ;

    上述代码中 , 三目运算符 表达式 (a > b) ? a : b 的结果是一个数字 , 不是变量 ,

    因此 , C 语言 中的 三目运算符 表达式 不能作为左值使用 ;


    下面的代码中 , 尝试为 三目运算符表达式 赋值 , 结果报错 ;

    代码示例 :

    #include 
    
    int main() {  
        int a = 10;  
        int b = 20;  
    	
    	// 尝试 为 三目运算符 表达式赋值
        (a > b) ? a : b = 30;   
      
        return 0;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    执行结果 :

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述





    三、C++ 语言中的三目运算符增强



    在 C++ 语言中 , 对 三目运算符表达式 进行了增强 ,

    C++ 中 , 三目运算符表达式 返回的是一个 表达式 , 不是实际的值 , 而是表达式本身 ;

    在 C++ 中 , 三目运算符 可以作为左值使用 , 就是为 返回的 表达式 赋值 ;


    三目运算符语法 :

    condition ? expression1 : expression2
    
    • 1

    上面的 condition 必须是一个 返回布尔值 的表达式 ;

    • 如果 condition 的值为 true , 则整个 三目运算符 表达式 返回 expression1 ;
    • 如果 condition 的值为 false, 则整个 三目运算符 表达式 返回 expression2 ;

    注意 C 语言直接返回表达式的值 , C++ 语言返回的是表达式 , 不会求值 ;


    C++ 中的 三目运算符 返回的事一个 内存空间地址 , 也就是 表达式变量 的 内存首地址指针 ;

    C++ 中的 三目运算符 返回值 , 既可以作为左值 , 又可以作为右值 ;


    代码示例 :

    // 导入标准 io 流头文件
    // 其中定义了 std 命名空间
    //#include 
    // 导入 std 命名空间
    //using namespace std;
    
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    执行结果 :

    Maximum value : 30
    a = 10 , b = 30
    
    • 1
    • 2

    在这里插入图片描述





    四、C 语言中 三目运算符 作为左值使用



    C 语言的 三目运算符 返回的是计算完成之后的值 , 因此 该返回值 不能作为 左值使用 , 不能被赋值 ;

    C++ 语言中的 三目运算符 返回的事 变量本身 , 本质是第一个地址 , 可以被赋值 , 既可以作为左值 , 又可以作为右值使用 ;

    有个特殊情况 : 如果 三目运算符 返回的是一个常量值 , 那么 C++ 中该返回值不能作为左值 , 也是会报错的 ;


    一个表达式可以作为左值 , 那么该表达式必须有内存空间 , 如果让 三目运算符 返回的是 地址 , 那么在 C 语言中 , 可以使用指针为该地址赋值 , 就可以作为左值使用 ;

    下面的代码中 , 令 三目运算符 返回 变量的地址 , 然后使用 指针 为该地址赋值 , 即可实现 C++ 中三目运算符的效果 , C++ 编译器 就是实现的如下操作 , 返回地址 然后为 地址赋值 ;


    代码示例 :

    #include 
    
    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;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    执行结果 :

    C:\Users\octop\Desktop>gcc hello.c
    
    C:\Users\octop\Desktop>a.exe
    Maximum value : 30
    a = 10 , b = 30
    
    C:\Users\octop\Desktop>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

  • 相关阅读:
    问题 R: 超级楼梯(递推,基础DP)查表
    milvus Delete api写s3的流程
    蓝桥杯--挖地雷
    mysql left join查询慢
    Spark读入ProtoMessage并写出为Parquet
    web协议-接口测试-Python自动化面试题
    HTML核心(9)- 列表元素
    自然语言处理学习路线(1)——NLP的基本流程
    《Reinforcement Learning: An Introduction》第4章笔记
    SNAT和DNAT
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132384635