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

2023-08-19 23:31:14





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



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


三目运算符语法 :

condition ? expression1 : expression2

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

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

代码示例 :

#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;  
}

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


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





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



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

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

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


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

代码示例 :

#include <stdio.h>

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

执行结果 :

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>

在这里插入图片描述





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



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

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

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


三目运算符语法 :

condition ? expression1 : expression2

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

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

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


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

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


代码示例 :

// 导入标准 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;
}

执行结果 :

Maximum value : 30
a = 10 , b = 30

在这里插入图片描述





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



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

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

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


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

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


代码示例 :

#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;  
}

执行结果 :

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

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

C:\Users\octop\Desktop>

在这里插入图片描述

更多推荐

【C语言】指针的进阶(一)

目录前言1.字符指针2.指针数组3.数组指针3.1数组指针的定义3.2&数组名VS数组名3.3数组指针的使用4.数组参数、指针参数4.1一维数组传参4.2二维数组传参4.3一级指针传参4.4二级指针传参5.函数指针前言指针在C语言中可谓是有着举足轻重的存在,初学C语言的我们在《指针》章节已经接触过了一些指针的知识,知道

【网络豆送书第四期】《用户画像:平台构建与业务实践》

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。公众号:网络豆座右铭:低头赶路,敬事如仪个人主页:网络豆的主页​​​​​本期好书推荐:《用户画像:平台构建与业务实践》粉丝福利:书籍赠送:共计送出4本参与方式:关注公众号:网络豆云计算学堂回复关键词:第四期送书截止时间:2023年9月24日中午12:00

嵌入式C语言知识复习和提高

文章目录前言基础知识main函数防BUG注释(重要)关键字标识符命名(驼峰命名)常量类型变量printf1.输出不同类型数据2.输出不同宽度数据3.不同类型数据长度归类scanf函数运算符sizeof(运算符,优先级2)逗号运算符关系运算符逻辑运算符三目运算符强制类型转换流程控制if语句switchcase循环结构fo

Python基于Flask的高校舆情分析,舆情监控可视化系统

目录一、数据采集二、数据预处理三、舆情分析四、数据可视化五、系统集成六、用户交互功能实现:七、系统优化总结随着互联网的普及和信息量的爆炸式增长,网络舆情数据变得越来越庞大和复杂。高校作为社会的重要组成部分,其舆情数据同样具有重要意义。因此,为了更好地监控和了解高校舆情数据的动态和发展趋势,我们需要构建一个基于Flask

Linux 终端命令总结

一、常用的七条命令命令对应英文作用lslist查看当前文件夹下的内容pwdprintworkdirectory查看当前所在文件夹cd[目录名]changedirectory切换文件夹touch[文件名]touch如果文件不存在新建文件mkdir[目录名]makedirectory创建目录rm[文件名]remove删除指

Appium元素定位

1.目的当今社会,人们的生活几乎已经无法离开形形色色的APP了,它提供给我们的便利与服务意义远远超出了其本身的软件价值。作为测试来说移动应用也早已是各大互联网公司的拳头产品,其本身的开发周期短,附属产品价值高等特性决定了今后的主导地位。那么在日常的测试活动中,移动应用的质量保障就成为了各个测试团队的主要课题,面对高速迭

软件定制app开发方式与优势|小程序搭建

软件定制app开发方式与优势|小程序搭建目前软件定制app开发方式主要两种1、利用模板开发很多软件开发公司会以模板的方式出售,即现有的app功能和设计样式都是现成的,无需从零开始定制开发。优点:费用低,一般价格在几千到上万。快速上线,方便实惠;缺点:功能固定,难以修改。在此之前需要确定自己需要哪些功能,现有app模板是

小乌龟(TortoiseGit)连接GitLab

目录🍟写在前面🍟实验目标🍟安装gitlab🍿1、安装依赖🍿2、下载清华gitlab包🍿3、安装gitlab🍿4、修改配置文件🍿5、管理命令🍟访问gitlab🍟界面设置🍿修改语言🍿修改密码🍿创建项目🍟下载小乌龟安装包🍟配置ssh秘钥🍟Git目录设置🍟推送/拉取操作🦐博客主页:大虾好吃吗

【hive】行转列—explode()/posexplode()/lateral view 函数使用场景

文章目录一、lateralview函数二、explode()函数三、posexplode()函数四、行转列使用单列转多行多列转多行一、lateralview函数功能:用于和UDTF函数(explode,split)结合使用,把某一行数据拆分成多行数据,再将多行结果组合成一个支持别名的虚拟表。主要解决select使用UD

华为云云耀云服务器L实例评测|使用华为云云耀云服务器L实例部署 GitLab Runner实现GitLab CI/CD,项目的DevOps

应用场景GitLabRunner介绍GitLabRunner是一个用于执行GitLabCI/CD任务的工具,它可以在Linux、macOS和Windows上使用,并且可以通过包管理器、二进制文件或Docker镜像进行安装。它与GitLabCI结合使用,能够在最少的手动干预下帮助团队实现CI/CD流程的自动化。GitLa

《PostgreSQL中的JSON处理:技巧与应用》

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🐅🐾猫头虎建议程序员必备技术栈一览表📖:🛠️全栈技术FullStack:📚MERN/MEAN/MEVNStack|🌐Jamstack|🌍GraphQL|🔁RESTfulAPI|⚡WebSockets|🔄CI/CD|🌐Git&Versio

热文推荐