03 C++中的三元运算符

大家好,我是陈同学。我们开始今天的分享。

三元运算的介绍

三元运算符相信大家都不陌生,它可以进行一些简单的判断操作。
在C和C++中三元表达式如下:

条件表达式 ? 表达式1 : 表达式2;

其中,条件表达式的值会被判断,如果为真,则整个表达式的为表达式1的;如果为假,则整个表达式的为表达式2的
在这里我们需要注意的是C语言中的三元运算表达式返回的是一个具体的值,也就是说它不可以作为左值的。与之不同的是在C++中三元运算表达式返回的是变量本身,他是可以作为左值的。
我们下面通过几个简单的例子来比较两者差异。

例子1

/**
 *@file 04C语言中的三目运算符.c
 *@author chenshining
 *@version v1.0
 *@date 2023-07-08
 */
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <math.h>
/**
 * 在C语言中三目运算符的使用
 * C语言中表达式的返回结果存放于寄存器中
 * C语言 表达式的返回值是一个确定的值而不是一个变量
 * 
*/

int main(){

    int a = 10;
    int b = 11;
    //( a < b ? a : b) = 30; =====> 10=30;   报错: 表达式必须是可修改的左值
    int c = ( a < b ? a : b);    // c=min(a,b)
    printf("c:%d\n",c);
    return 0;
}

根据上面的例1我们可以作如下总结

  1. C语言中三元表达式的返回结果存放于寄存器中
  2. C语言中三元表达式的返回值是一个确定的值而不是一个变量

例子2

/**
 *@file 04三目运算符.cpp
 *@author chenshining
 *@version v1.0
 *@date 2023-07-06
 */
#include <iostream>
#include <vector>

using namespace std;
/**
 * 
 * 1)C语言返回变量的值 C++语言是返回变量本身
 *  C语言中的三目运算符返回的是变量值,不能作为左值使用
 *  C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
 *  2)注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
 *  (a < b ? 1 : b )= 30;
 *  3)C语言如何支持类似C++的特性呢?
 * ====>当左值的条件:要有内存空间;让表达式返回一个内存空间/内存首地址 指针
 * 思考:如何让C中的三目运算法当左值呢?
 *  4) 本质:C++编译器完成了取地址的工作
 **/

int main(){

    int a = 10;
    int b = 11;
    (a < b ? a : b) = 30;   /// 返回a b中小的变量,并将该变量赋值30
    cout << "a:" << a <<endl;
    cout << "b:" << b <<endl;
    return 0;
}

与C语言不同的是C++的三元运算符返回的是变量本身,因此可以出现在程序的任何地方。当然这里有一个注意点,当C++中的三元运算表达式中有一个是常量,则则不能作为左值使用

那么如何让C语言的三元运算表达式也可以作为左值呢?
首先我们了解作左值的必要条件(ChatGTP的回答):

  • 可寻址性(Addressability): 左值必须有内存地址,这样才能在内存中定位并进行赋值操作
  • 持久性(Persistency): 左值必须是持久的,也就是说,它们所引用的内存地址在整个表达式的生命周期中保持不变。
  • 非位字段(Not a Bit-field): 左值不能是位字段,位字段是一种特殊的数据结构,无法直接进行地址取得和赋值操作。
  • 非寄存器变量(Not a Register Variable): 在C语言中,寄存器变量是存储在寄存器中的变量,无法通过地址来访问,因此不能作为左值。
  • 不是常量(Not a Constant): 左值不能是常量,因为常量是不可修改的
    总结一下就是,左值必须有可寻址的持续的内存空间。我们可以联想到指针,具体请见例3。

例子3

/**
 *@file 04C语言中的三目运算符.c
 *@author chenshining
 *@version v1.0
 *@date 2023-07-08
 */
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <math.h>
/**
 * 在C语言中三目运算符的使用
 * C语言中表达式的返回结果存放于寄存器中
 * C语言 表达式的返回值是一个确定的值而不是一个变量
 * 
*/

int main(){

    int a = 10;
    int b = 11;
    *(a < b ? &a : &b) = 30;   // 返回a b中小的变量,并将该变量赋值30
    printf("a:%d\n",a);
    return 0;
}
### C++ 三元运算符的使用方法 C++三元运算符是一种简洁的方式,用于执行基于条件的选择操作。其基本语法为 `condition ? expression_if_true : expression_if_false`[^1]。 #### 基本用法 当需要根据某个布尔条件来决定返回两个不同值之一时,可以使用三元运算符。例如: ```cpp #include <iostream> using namespace std; int main() { int num = 5; string result = (num % 2 == 0) ? "Even" : "Odd"; cout << "The number is: " << result << endl; return 0; } ``` 上述代码中,`(num % 2 == 0)` 是条件部分,如果该条件成立,则返回 `"Even"`;否则返回 `"Odd"`[^4]。 #### 应用于字符串选择 除了数值类型的比较外,三元运算符还可以直接应用于字符串或其他复杂数据结构的选择。例如: ```cpp #include <iostream> #include <string> using namespace std; int main() { int age = 20; string status = (age >= 18) ? "Adult" : "Minor"; cout << "User Status: " << status << endl; return 0; } ``` 此示例展示了如何通过年龄判断用户的法律状态并赋给变量 `status`[^2]。 #### 结合引用使用 三元运算符不仅可以返回常量或对象本身,还能返回变量的引用以便进一步修改较大值的情况。例如: ```cpp #include <iostream> using namespace std; int main() { int a = 10, b = 20; int& max_value = (a > b) ? a : b; // 获取最大值的引用 max_value *= 2; // 将最大值加倍 cout << "New values of a and b after doubling the maximum:" << endl; cout << "a=" << a << ", b=" << b << endl; return 0; } ``` 在这个例子中,我们不仅选择了更大的数作为目标,还对其进行了更新操作。 #### 多层嵌套应用 虽然不推荐过度依赖复杂的多级嵌套形式以免降低可读性,但在某些情况下确实可能需要用到这样的方式实现更精细控制逻辑的功能。比如下面的例子演示了一个三层嵌套的应用场景: ```cpp #include <iostream> using namespace std; int main(){ double score = 75.5; char grade = ((score>=90)?'A': ((score>=80)?'B': ((score>=70)?'C':'D'))); cout<<"Grade:"<<grade<<endl; return 0; } ``` 这里依据分数范围分别赋予相应的等级字母表示成绩的好坏程度[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值